游客发表
CTF里Web题是基解题最容易上手的,也是础题最容易卡住的。上手是型及因为你打开浏览器就能测,卡住是基解题因为考点太碎,一个参数没传对,础题页面连报错都不给。型及我打过的基解题Web题里,大概六成死在信息收集不仔细,础题三成死在payload构造差一点,型及剩下一成纯属运气。基解题
先看源码。础题不是型及右键查看源代码那种看,是基解题F12打开开发者工具,把Network、础题Console、型及Application三个面板全过一遍。有次一道题,页面就一个登录框,源码里藏了段注释:<!-- test.php.bak -->。直接访问/test.php.bak,下载到源码,里面写着if($pass == "240610708")。这就是典型的备份文件泄露,考的是你知不知道.bak、.swp、~这些后缀。
SQL注入现在很少让你直接' or 1=1 --了。更多是布尔盲注或者时间盲注。布尔盲注的套路:id=1' and (select substr(database(),1,1))='s' --+,页面正常就说明猜对了。时间盲注靠sleep(),id=1' and if(1=1,sleep(3),0) --+,看响应时间。我习惯先用sqlmap跑一遍,但比赛里经常有WAF,这时候手注反而稳。有个细节:--+在URL里要编码成--%20,或者直接用#,但#在URL里会被当成锚点,得写成%23。
文件上传题,前端JS校验基本是摆设。改Content-Type为image/png,或者后缀改成.phtml、.php5、.pht。有次题目只允许.jpg,我传了个shell.jpg,内容是一句话木马,然后用.htaccess把.jpg解析成PHP。具体做法:先传.htaccess文件,内容写AddType application/x-httpd-php .jpg,再传shell.jpg,访问就执行了。这招在Apache环境里百试百灵,Nginx就不行,得看配置。
命令执行题,分号;、管道|、与&&、或||都能用。但空格经常被过滤,用$IFS或者${ IFS}代替。比如cat$IFS/etc/passwd。还有<重定向,cat</etc/passwd。如果cat也被过滤,试试tac、nl、more、less。最绝的是用base64编码整个命令:echo bHM= | base64 -d | sh,这样连关键字都绕过了。
SSRF题现在喜欢考gopher协议打内网Redis。构造gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a...,把Redis的写文件操作塞进去。有次我卡在编码上,%0d%0a必须写对,少一个%都不行。后来用Python的urllib.parse.quote生成payload,一次就过了。
反序列化在PHP里看__wakeup、__destruct、__toString。Python的pickle更直接,pickle.loads直接执行os.system。Java的反序列化最麻烦,要ysoserial生成payload,还得找commons-collections的版本。有次比赛给了个readObject方法,我盯着看了半小时,发现它调用了Runtime.exec,但参数是硬编码的ls。这就没辙,只能找别的入口。
最后说个经验:Web题别急着写脚本。先手动测,把每个参数、每个Cookie、每个Header都改一遍。有次我把User-Agent改成admin,直接给了flag。还有次把X-Forwarded-For改成127.0.0.1,绕过了IP限制。这些点脚本扫不出来,得靠人看。工具是辅助,思路才是核心。
友情链接