[SUCTF 2019]EasyWeb(异或rce,.htaccess文件上传)
我们打开页面,发现好大一串代码,我们进行代码审计
1 | <?php |
我们可以发现代码最后要进行命令执行,但对我们的参数内容进行了过滤,所以为无字母数字rce,我们可以用取反、自增、异或来构造我们所需代码,但由于长度进行了限制,我们不能通过取反和自增来进行命令执行,我们只能用异或
我们构造异或脚本
1 | <?php |
运行得到,因为这里还有字符种类限制,所以前面的都得一样
我们得到payload
1 | ?_=${%86%86%86%86^%d9%c1%c3%d2}{%86}();&%86=phpinfo |
我们可以看到phpinfo()页面,php版本为7.2
非预期解
flag在phpinfo()里面
预期解
我们再看一下get_the_flag函数
1 | function get_the_flag(){ |
代码审计可知文件路径会自动打印出来,但过滤了ph后缀,同时文件中不能有<?,而且要传图片。
由于过滤了ph后缀,我们首先要想到传.htaccess或者在有php文件的情况下传user.ini,这题是传.htaccess
然后就是新姿势了,就是怎么让.htaccess文件被判断成图片。直接在文件内容前加上GIF89a是不行的,我们考虑两种新方法
方法1:
1 | 在文件前加 |
方法2:
1 | 在.htaccess前添加x00x00x8ax39x8ax39(要在十六进制编辑器中添加,或者使用python的bytes类型) |
由于文件内容过滤了<?,我们就不能写php代码了,我们可能会想到,但由于该题的php版本太高,这种方法不适用了,我们解锁新知识
1 | #define width 1337 |
这里是利用auto_append_file来包含base64解码的123.ashhh文章,这样往123.ashhh里写base64加密的马,就能绕过<?了
但是还有一个细节需要注意,我们的123.ashhh也需要是个图片,需要在前面加上GIF89a,但是这只有6个字符,需要再随便加上2个base64有的字符,这样解码的时候才能正确解码,而且不会影响到后面的PHP一句话:
1 | GIF89a12 |
然后我们要上传脚本
1 | import requests |
得到路径
我们访问shell.ahhh
上传成功,我们打开蚁剑进行连接
连接成功,在根目录找到flag