1. 程式人生 > 其它 >BUUCTF:[SUCTF 2019]Pythonginx

BUUCTF:[SUCTF 2019]Pythonginx

技術標籤:CTF_Web_Writeup

題目提示了,是ngix,所以我們要知道nginx一些檔案存放的地方

配置檔案存放目錄:/etc/nginx
主配置檔案:/etc/nginx/conf/nginx.conf
管理指令碼:/usr/lib64/systemd/system/nginx.service
模組:/usr/lisb64/nginx/modules
應用程式:/usr/sbin/nginx
程式預設存放位置:/usr/share/nginx/html
日誌預設存放位置:/var/log/nginx
配置檔案目錄為:/usr/local/nginx/conf/nginx.conf

題目原始碼如下

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document<
/title> </head> <body> <form method="GET" action="getUrl"> URL:<input type="text" name="url"/> <input type="submit" value="Submit"/> </form> <code> @app.route
('/getUrl', methods=['GET', 'POST']) def getUrl(): url = request.args.get("url") host = parse.urlparse(url).hostname if host == 'suctf.cc': return "我扌 your problem? 111" parts = list(urlsplit(url)) host = parts[1] if host == 'suctf.cc': return "我扌 your problem? 222 " + host newhost = [] for h in host.split('.'): newhost.append(h.encode('idna').decode('utf-8')) parts[1] = '.'.join(newhost) #去掉 url 中的空格 finalUrl = urlunsplit(parts).split(' ')[0] host = parse.urlparse(finalUrl).hostname if host == 'suctf.cc': return urllib.request.urlopen(finalUrl).read() else: return "我扌 your problem? 333" </code> <!-- Dont worry about the suctf.cc. Go on! --> <!-- Do you know the nginx? --> </body> </html>

程式碼審計,不是很難,前兩個要求我們判斷 host 是否是 suctf.cc ,如果不是才能繼續。第三個if要求我們當經過了 decode(‘utf-8’) 之後傳進了 urlunsplit 函式後,第三個if讀入的要是suctf.cc。
所以我們構造一個payload
在nginx中,字元℆ 在後臺轉碼會解析為c/u,我們可以用℆進行繞過

file://suctf.c℆sr/local/nginx/conf/nginx.conf

在這裡插入圖片描述
我們發現裡面存在著一個/flag檔案在/user/fffffflag中
構造payload進行讀取

file://suctf.c℆sr/fffffflag

在這裡插入圖片描述
flag:

flag{ce8672af-ac55-46eb-971c-01952589cbba}