[WUSTCTF2020]CV Maker
可以看到有个注册页面,尝试注册一个用户登进去看看
进来后第一眼就看到文件上传,尝试上传,上传php后返回了
文件上传后端检测exif_imagetype()函数
他提示不是image,也就是需要我们构造一个文件头为图像类型的php一句话木马。
加个文件头 GIF89 就可以了
然后源代码找到了文件上传后的路径
使用蚁剑连接即可。
[红明谷CTF 2021]write_shell
上来就代码审计
check函数,用于检测输入字符串是否包含危险字符或关键字。如果检测到 '
, _
, php
, ;
, ~
, ^
, +
, eval
, {
, }
等字符或关键词,则输出 hacker!!!
并停止执行,否则返回输入。
waf函数,用于对输入进行 Web 应用防火墙(WAF)检测。如果输入是数组,则递归调用自身对每个元素进行检测,否则调用 check
函数进行检测。
根据用户的 IP 地址生成一个唯一的目录路径,路径格式为 sandbox/
目录下的 IP 地址的 MD5 哈希值。如果 action
参数是 pwd
,则输出生成的目录路径。如果 action
参数是 upload
,获取 GET
请求中的 data
参数,调用 waf
函数对 data
进行检查,然后将 data
写入到指定目录中的 index.php
文件。
那么这个题就是利用file_put_contents函数写入木马。
php标签的php
被过滤,可以换用短标签<?= code?>
,至于;
被过滤并不用单行,因为?>
对于一组PHP代码中最后一句起到替代;
的作用,所以我们可以构造如下payload:
?action=upload&data=<?=`ls`?>
然后再?action=pwd查看目录
可以发现成功执行了,那么接下来就查看根目录
?action=upload&data=<?=`ls%09/`?>
查看flllllll1112222222lag的内容
?action=upload&data=<?=`cat%09/flllllll1112222222lag`?>
这题主要有两个知识点 1.php短标签 2.php可在``中执行系统命令.
PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符"`"的效果与函数shell_exec() 相同。
[GWCTF 2019]枯燥的抽奖
可以看到题目要求我们猜到20位数,才能够得到flag。
但是出题人是给了源代码的。从前端跟到check.php可以看到后台代码
代码审计,涉及到随机数,mt_rand函数,这牵扯到一个安全问题。
1. 伪随机数
伪随机数是用确定性的算法计算出来的随机数序列,它并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的初值(种子)不变,那么伪随机数的数序也不变。伪随机数可以用计算机大量生成,在模拟研究中为了提高模拟效率,一般采用伪随机数代替真正的随机数。模拟中使用的一般是循环周期极长并能通过随机数检验的伪随机数,以保证计算结果的随机性。伪随机数的生成方法有线性同余法、单向散列函数法、密码法等。
mt_rand就是一个伪随机数生成函数,它由可确定的函数,通过一个种子产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。
所以:大致过程就明了了,我们根据已经给出的部分随机数,利用工具找出seed(种子),然后得到完整的随机数。
2. 将已知的部分伪随机数转化为php_mt_seed工具可以看懂的数据
str1 ='SZiQYsNmNK'
str2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result =''length = str(len(str2)-1)
for i in range(0,len(str1)):for j in range(0,len(str2)):if str1[i] == str2[j]:result += str(j) + ' ' +str(j) + ' ' + '0' + ' ' + length + ' 'breakprint(result)
输出的结果
54 54 0 61 61 61 0 61 8 8 0 61 52 52 0 61 60 60 0 61 18 18 0 61 49 49 0 61 12 12 0 61 49 49 0 61 46 46 0 61
3. 下载php_mt_seed工具并且使用
根据生成算法逆向出满足php_mt_seed工具要求的参数
下载连接:
php_mt_seed - PHP mt_rand() seed cracker
得到种子,同时要注意php版本是php7.1以上
的。
得到完整的字符串
<?php
mt_srand(348806110);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo "<p id='p1'>".$str."</p>";
?>
PHP的mt_rand函数作为一个随机数生成工具在程序中被广泛使用,该函数用了 Mersenne Twister 算法的特性作为随机数发生器,它产生随机数值的平均速度比 libc 提供的 rand() 快四倍。mt_rand函数有两个可选参数 min 和 max,如果没有提供可选参数,mt_rand函数将返回返回 0 到 mt_getrandmax() 之间的伪随机数。例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5, 15)。
常用的使用方式如下:
<?phpecho mt_rand() . "\n";echo mt_rand() . "\n";echo mt_rand(5, 15);?>
输出
160471601414786132786
详解看PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户