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_1md5_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

相关推荐
李先静6 分钟前
AWTK-WEB 快速入门(1) - C 语言应用程序
c语言·开发语言·前端
weixin_4467077420 分钟前
IDEA2024 maven构建跳过测试
java·maven
开朗觉觉27 分钟前
RabbitMQ高可用&&延迟消息&&惰性队列
java·rabbitmq·java-rabbitmq
zmd-zk28 分钟前
flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)
java·大数据·开发语言·学习·flink·tensorflow
昵称202131 分钟前
flink1.16+连接Elasticsearch7官方例子报错解决方案
java·flink·es7
圆蛤镇程序猿32 分钟前
【什么是SpringMVC】
开发语言
爱编程的小生43 分钟前
Easyexcel(6-单元格合并)
java·excel
Domain-zhuo1 小时前
JS对于数组去重都有哪些方法?
开发语言·前端·javascript
小白不太白9501 小时前
设计模式之 迭代器模式
java·设计模式·迭代器模式
闲人一枚(学习中)1 小时前
设计模式-创建型-单例模式
java·单例模式·设计模式