1.[NISACTF 2022]easyssrf
1)进入环境后,他给了一个上url个文本框
2)看了源码,没啥用,那就直接跟着它提示走,输入一个网址http://127.0.0.1/flag.php
3)回显又给了/fl4g,直接file///fl4g查看
4)接着回显给了后缀为php的文件,直接打看
5)发现是一段php代码
<?php
highlight_file(__FILE__);
error_reporting(0);
$file = $_GET["file"];
if (stristr($file, "file")){
die("你败了.");
}
//flag in /flag
echo file_get_contents($file);
-
这时候就需要进行仔细的代码审计
-
这里使用
highlight_file(__FILE__)函数;
将当前文件的源代码高亮显示输出,使得用户可以查看代码。 -
然后又使用
error_reporting(0)函数;
禁用了PHP错误报告,这意味着如果运行出现错误,脚本就不会将错误信息显示给用户。 -
然后才是这题关键地方,从
$_GET
超全局数组中获取名为file
的参数,并将其赋值给变量$file
。接着使用stristr()
函数检查用户提供的文件参数中是否包含字符串 "file",如果存在,则程序终止执行,并输出字符串 "你败了."。查阅后才知道 这应该是为了防止用户尝试读取系统上的其他敏感文件。 -
最后,通过
file_get_contents()
函数读取用户提供的文件,并将文件内容输出给用户。
6)说来说去它其实就是想告诉我们要用filter伪协议读取根目录下的flag
尝试编写/?php://filter/read=convert.base64-encoude/resource=/flag,得到flag
2.[SWPUCTF 2022 新生赛]ez_ez_php
1)进入环境2)进来是直接的php代码,进行代码审计
这里它大致的意思应该是说如果 URL 中包含名为 file
的 GET 参数,它会尝试包含该参数指定的文件。如果文件名以 "php" 开头(使用 substr()
函数检查),则输出 "Nice!!!" 并包含该文件。如果文件名不以 "php" 开头,则输出 "Hacker!!"。
substr(string,start<,length>)从string 的start位置开始提取字符串
注意:
substr中的start为负数时返回空值, substr从字符串右侧截取字符的方法, substr除了有字段截取的功能外,还可以用来替换字段。
根据php代码的大致意思加上代码最后给了flag.php.这里还是要用get传参的方式再利用filter伪协议读取文件内容
?file=php://filter/read=convert.base64-encoude/resource=flag
3.[NSSCTF 2022 Spring Recruit]babyphp
1)进入环境
2.进行代码审计
它大致的意思应该是
然后需要先过第一个if,需要a不含数字而且intval取整数
注:通过使用指定的进制 base 转换(默认是十进制),返回变量 value 的 int 数值。 intval() 不能用于 object,否则会产生 E_WARNING 错误并返回 1。 echo intval(array()); // 0 echo intval(array('foo', 'bar')); // 1
所以这里传入一个数组就能过掉第一个if,a[]=1
然后开始绕过第二个if条件,第二个很简单,就直接传入b1和b2就好了,那么往下看第三个if条件,意思是传入的b1条件不等于b2,与md5加密的b1等于b2,这个在很多题目上都用到了,因为md5不会处理数组,面对数组都会返回为null所以使用b1[]=1&b2[]=2
b1[]=1&b2[]=2
md5(b1[]=1)===md5(b2[]=1)
接下来就是第4个if语句了,这个的话需要传入c1和c2,且c1不等于c2,还要满足条件c1和c2都要是字符串类型, c1和c2的md5加密是弱类型,所以前两位相同就可以,要传入值是字符串且md5值相等
这里是弱比较,用0e绕过,下面是0e开头的md5值
3.可以构造payload为a[]=1&b1[]=1&b2[]=2&c1=QNKCDZO&c2=QLTHNDT
上传即可得到flag
4.[SWPUCTF 2022 新生赛]funny_php
1)进入环境后依旧是熟悉的php代码
先进行代码审计
如果参数 num
存在且满足特定条件,则输出 :D
并设置会话变量 $_SESSION['L1']
为 1。
如果参数 str
存在,则对其进行处理,如果等于特定字符串 "NSSCTF"
,则输出 "wow"
并设置会话变量 $_SESSION['L2']
为 1。
接下来,根据 POST 请求中的参数执行不同的操作:如果参数 md5_1
和 md5_2
存在,并且它们不相等,且它们的 MD5 散列值相等,则输出 "Nice!"
并在进一步检查参数的类型后,设置会话变量 $_SESSION['L3']
为 1。
最后,如果三个会话变量 $_SESSION['L1']
、$_SESSION['L2']
和 $_SESSION['L3']
都存在,则包含 flag.php
文件并输出flag。
2)审完之后就一步一步来
长度要小于3,值要大于999999999,绕过使用科学计数法方式,即9e9=9000000000
3)然后到str值,说是要强等于NSSCTF并且在此之前会被替换为空,那正好满足双写绕过
4)接着到下一个循环,根据代码所写,这里又是常见的弱比较,这里我用的是0e绕过
post传参后得到flag