Less-32 宽字节
<!--
下午整了半天Less-29~31,愣是没调好jsp环境,只好跳过。
难受.jpg
!-->
Less-32:
核心语句:
各种回显均存在。
第一句话指定了字符集为gbk。
chech_addslaches 函数是个很强的过滤:
在第二行和第三行,
它通过在前面加一个反斜杠将其转义的方式,屏蔽了单引号和双引号。经过测试,被转义后的单双引号出现在sql语句中不会引起任何报错。
在第一行,
它把所有单独出现的反斜杠变成了两个反斜杠,也相当于将其转义了。
这是怎么做到的呢?
preg_quote()将里面内容中的特殊字符前加一个反斜杠构成转义,以便这些字符能被原样抓走。
在这里, '/'. preg_quote('\\') .'/' 等效于 '/\\\\/' 或 '/\\\\/'
更广泛的,正则表达式特殊字符一般有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
小圆点连接是一种PHP常用写法,在PHP代码审计中也会经常出现。
至于后面为什么需要六个反斜杠:
首先,三个反斜杠起转义另外三个反斜杠的作用;正则抓到了三个反斜杠。
再次,观察以下输出:
二、四个反斜杠较好理解;
三个反斜杠的时候,前两个反斜活了一个,由于不存在\a转义,第三个反斜也活下来了。
如果那个字母是f、n、t这类的,就不太行了;但这种情况其实根本输不进来。
(还是有点迷糊的;但先这么理解吧)
对于本题,我们采用宽字节注入。
字符集也叫字符编码,是一种将符号转换为十六进制数的转换关系。
ASCII编码:单字节编码
gbk编码:单字节和双字节编码,若第一字节在0x00-0x7F范围内,就为单字节,和 ASCII 保持一致。0x80不作为第一字节使用。双字节的第一字节范围是0x81-0xFE。
utf-8编码:多节编码,若第一字节在0x00-0x7F范围内,就为单字节,和 ASCII 保持一致。其它字符用二至四个字节变长表示。
宽字节就是两个及以上的字节。
由此,构造:(%27是单引号,%5c是反斜杠)
(1)%aa%27
经过过滤:%aa%5c%27
aa大于7f,提示这是个双字节。
解码结果:猏'
(2)%aa%5c%27
经过过滤:%aa%5c%5c%5c%27
解码结果:猏\\' ;两个反斜等于没有。
于是,单引号被解放出来了。
(解码:http://www.mytju.com/classcode/tools/urldecode_gb2312.asp;brup的decoder好像不顶用?)
本题一种payload:?id=-1%df%27 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?