php题解(巩固基础知识)代码审计

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); 
  1. 这时候就需要进行仔细的代码审计

  2. 这里使用 highlight_file(__FILE__)函数; 将当前文件的源代码高亮显示输出,使得用户可以查看代码。

  3. 然后又使用 error_reporting(0)函数; 禁用了PHP错误报告,这意味着如果运行出现错误,脚本就不会将错误信息显示给用户。

  4. 然后才是这题关键地方,$_GET 超全局数组中获取名为 file 的参数,并将其赋值给变量 $file。接着使用 stristr() 函数检查用户提供的文件参数中是否包含字符串 "file",如果存在,则程序终止执行,并输出字符串 "你败了."。查阅后才知道 这应该是为了防止用户尝试读取系统上的其他敏感文件。

  5. 最后,通过 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

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值