Less 35
基于错误_GET_数字型_addslashes()_宽字节注入
这关很调皮,数字型查询根本不需要在乎是否被addslashes()
。
一切回到了第一关,最初始的注入方式。
但还是有存在的必要的,能启发我们思考:当我们面对一个一无所知的网站时应怎么分析后台。
0x01. 判断注入类型
这关有错误回显,所以比较容易判断:
http://localhost:8088/sqlilabs/Less-35/?id=1'
可以从 MySQL 错误信息中直接看出是数字型查询,判断没有其他过滤后是最简单最初级的注入。
0x02. 数字型or被过滤
而没有错误回显时,我们又应该怎么判断是数字型注入还是引号被过滤呢?
在能分辨出正确回显和错误回显(有固定字符串)时,id=1
正确回显,尝试id=1'
和id=1"
:
- 若两者都正确回显:很可能是被过滤引号
- 若两者都错误回显:很可能是数字型查询
- 若一正确一错误:基本可确定是字符型查询
更多的分析等完结后的注入方式分析。
Less 36
基于错误_GET_单引号_字符型_mysql-real-escape-string()_宽字节注入
0x01. PHP过滤函数
mysql_real_escape_string()
这个函数是 PHP 过滤的常见函数,在 Less 17 中有详细介绍:
mysql_real_escape_string()函数
mysql_real_escape_string(string,connection)
参数 | 描述 |
---|---|
string | 必需,规定要转义的字符串 |
connection | 可选,规定MySQL连接。如果未规定,则使用上一个连接 |
mysql_real_escape_string()
函数转义 SQL 语句中使用的字符串中的特殊字符:
\x00
\n
\r
\
'
"
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回FALSE
。
本函数将字符串中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于
mysql_query()
,可使用本函数来预防数据库攻击。
0x02. 注入过程
注意:在《注入天书》中提到:
但是因 MySQL 我们并没有设置成 GBK,所以
mysql_real_escape_string()
依旧能够被突破,方法和上述addslashes()
是一样的。在使用
mysql_real_escape_string()
时,若想防范这种问题,需要将 MySQL 设置为 GBK:
Mysql_set_charset(‘gbk’,’$conn’)
原理暂不清楚,有待学习。
用%bb%27
和%bb%5c%5c%27
均可绕过'
过滤,有错误回显可以看出是单引号闭合,剩余步骤同 Less 32。