[鹤城杯 2021]EasyP
就是php的代码审计
从中可以看出来,就是对四个if语句的绕过,然后过滤了一些语句
代码分析:
通过include 'utils.php';
导入了一个叫做"utils.php"的文件,这意味着在该文件中可能定义了一些与本代码相关的函数和变量。
然后,代码检查了是否有通过POST请求发送的"guess"参数。如果有的话,它将把该参数的值转换成字符串,并存储在变量$guess中。
代码用条件判断语句检查用户猜测的guess是否等于一个名为secret的变量。如果相等,说明用户猜对了密码,就将一个包含flag的消息赋值给message变量。否则,说明用户猜错了密码,就将一个"Wrong. Try Again"的消息赋值给message变量。
代码的下一部分用正则表达式检查了当前PHP脚本文件的路径名是否以"utils.php"后面紧跟着零或多个斜杠(/)结尾。如果是的话,代码会退出并显示"hacker :)"。
紧接着,代码通过正则表达式检查了当前请求的URL(即$_SERVER['REQUEST_URI'])中是否包含"show_source"字符串。如果是的话,代码也会退出并显示"hacker :)"。
然后,代码检查了是否有通过GET请求发送的"show_source"参数。如果有的话,它会使用highlight_file函数来显示当前PHP脚本文件(通过basename($_SERVER['PHP_SELF'])获取)的源代码,并退出。
最后,如果前面的条件都不满足,代码将通过show_source函数显示当前PHP脚本文件的源代码,即__FILE__的内容。
这里比较迷惑的一个点就是,好像可以通过对第一个if判断语句的绕过就可以直接得到flag,但是它这里要爆破密码,因为要使两个变量值相等,这里就是第一个思路,但是这样的话,后面的各种正则就没什么用了,所以我估计这个密码大概率是爆破不出来的,但是作为思路还是先试一试。
试了两个字典,没有用,估计应该是爆破不出来
换思路,再仔细的对后面几个正则再次理解,进行绕过。
关于正则的话:
表达式/\/utils\.php\/?$/i可以用来匹配以/utils.php结尾的URL路径,解释一下各个部分:
/:正则表达式的开始标记。
\/:匹配斜杠字符/。由于斜杠在正则表达式中有特殊含义,需要使用反斜杠进行转义。
utils\.php:匹配字符串utils.php。由于.在正则表达式中有特殊含义,需要使用反斜杠进行转义。
\/?:匹配可选的斜杠字符/。?表示前面的字符或组是可选的。
$:匹配字符串的结尾。
/i:正则表达式的结束标记,表示不区分大小写。
看了好久,这里主要就是对两个知识点的运用:
一.['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI']
1.$_SERVER['PHP_SELF']:获取当前执行脚本的文件名(相对于网站根目录的路径及 PHP 程序名称。)
2.$_SERVER['SCRIPT_NAME']:获取相对于网站根目录的路径及 PHP 程序文件名称。
3.$_SERVER['REQUEST_URI']:获取当前URL的 路径地址。
举个栗子:(方便理解)
http://www.baidu.com/php/flag.php/flag?a=11111
执行$_SERVER['PHP_SELF'] 得到:/php/flag.php/flag
执行$_SERVER['SCRIPT_NAME'] 得到:/php/flag.php
执行$_SERVER['REQUEST_URI'] 得到:/php/flag.php/flag?a=11111
如果以本题为例子的话,实际上,这里用到这些函数的作用,是给了我们一个路径 ,大概让我们知道,跟flag有关的信息应该在哪个位置,要怎么找,这里涉及了解题的第一步,就是对路径的构造。
二.basename()
php basename()函数语法
作用:返回路径中的文件名部分。
语法:basename(path,suffix)
参数:
path 必需。规定要检查的路径。
suffix 可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。
说明:
返回路径中的文件名部分。
举个栗子:
<?php
$file = "/phpstudy/WWW/index.php";
echo basename($file);//带有文件扩展名
echo "
";
echo basename($file,'.php'); //去除文件扩展名
?>
输出:index.php
index
简单而言,bashname命令用于获取路径中的文件名或路径名。有一个师姐说的也是挺经典(basename():删除从最后一个斜杠之前的所有内容 ),简单粗暴。
然后这个函数得漏洞所在就是,basename()无法处理非ascii字符,如果传入的参数中出现了非ascii字符则会把它给丢弃。
然后呢,这里还涉及了一个魔术常量的问题,这里一并介绍吧。
__FILE__
是一个魔术常量,它包含当前脚本的完整路径和文件名。
最后呢,就还有一个过滤没有处理,就是GTE传参的show_source
这里要考虑绕过一个正则,作为补充知识点:
[ ,(空格) ,+ , . 这四个都可以被处理为_
构造payload
/utils.php/朱?show.source=1
出不来,考虑是不是路径出问题了,加个index.php试试 解出了flag(吐槽一下,这个位数的密码,要爆破怕至少两个星期,勾石)
[LitCTF 2023]Vim yyds
既然题目说,和vim泄露有关,那么按我的思路是,先用dirsearch扫一下看看(因为源代码里面没有什么有用的信息,就一个图片引用的超链接)
扫到一个可能有用的文件
访问一下看看
王德发??????(跟火绒斗智斗勇以后,我决定还是先关掉它)
虽然用记事本好像大概也能看,但是,还是正式点看看吧
这里就涉及知识点了,
vim信息泄露知识点:
vim 交换文件名
在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
以 index.php 为例:第一次产生的交换文件名为 .index.php.swp
再次意外退出后,将会产生名为 .index.php.swo 的交换文件
第三次产生的交换文件则为 .index.php.swn
在kali里面可以恢复这个文件
vim -r index.php.swp
这里恢复以后会另外存储
然后再访问就可以查看文件内容了(这里只截取有用的部分)
这里大概的意思就是有两个绕过,一个base64,一个OS命令执行,然后以POST传参的方式
然后post传参,得到flag,这里的tac和cat的作用是一样的,但是我就是想写tac
[NSSCTF 2022 Spring Recruit]babyphp
还是代码审计
-
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a']))
: 这是一个条件判断语句,检查是否存在名为"a"的POST参数,且该参数的值不包含数字(通过正则表达式检查),并且转换为整数后不为0。 -
在上述条件满足的情况下,进入嵌套的条件判断:
a.
if(isset($_POST['b1'])&&$_POST['b2'])
: 检查是否存在名为"b1"和"b2"的POST参数。b.
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2']))
: 检查"b1"和"b2"的值是否不相等,并且它们的MD5哈希值是否相等。c. 在上述条件满足的情况下,进入另一个嵌套的条件判断:
-
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2']))
: 检查"c1"和"c2"的值是否不相等,并且它们是字符串类型,并且它们的MD5哈希值是否相等。-
如果上述条件都满足,则输出flag。
-
否则,输出"yee"。
-
如果"b1"和"b2"的MD5哈希值不相等,则输出"nop"。
-
d. 如果"b1"和"b2"的值相等,则输出"go on"。
-
大概意思呢,就是数组绕过,然后0e绕过,我的理解大概就是这样,关于MD5,我已经做过详解,有兴趣观看关于MD5-CSDN博客
成功构造以后,得到了flag
[HNCTF 2022 Week1]Interesting_include
开局源码,而且给了提示,就是伪协议,但是要绕正则
payload
?filter=php://filter/read=convert.base64-encode/resource=./flag.php
解码,得到flag
[GDOUCTF 2023]EZ WEB
开始就是一个超链接,但是没什么用,看看源码
也没用,就是给了有一个src文件,访问一下看看
下载了一个python
这是一个使用 Flask 框架编写的简单 Web 应用程序,它定义了三个路由:
'/' - GET 请求会返回名为 'index.html' 的文件;
'/src' - GET 请求会返回名为 'app.py' 的文件;
'/super-secret-route-nobody-will-guess' - 只接受 PUT 请求,会返回名为 'flag' 的文件内容。
其中 '/super-secret-route-nobody-will-guess' 路由返回的内容可能是敏感信息
然后这里涉及的方法是put传参
PUT(书上找的)
put方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。如果请求指定的资源不存在,将会创建这个资源。
要详细的话,这个大佬讲的很好PUT和POST方法的区别-比较POST和PUT方法-CSDN博客
这里的话根据这个程序源码可知,要求就是是PUT方式下访问/super-secret-route-nobody-will-guess,可以def flag():
这里使用bp抓包修改
成功得到flag
[GDOUCTF 2023]hate eat snake
打开就是个游戏,我靠,这个速度,后面牛逼到离谱,玩了两把,该找flag了
审了一下,直接找到flag是不可能了,搓了半天,应该是搓到关键信息了
60就60,还整起表达式来了
这个弹窗,好像直接查看是做不到了(反正我是做不到),根据它的条件,传个代码调试台执行试试
得到flag
[HNCTF 2022 Week1]2048
还是审代码
为了满足条件判断,这里两种方法,一种是直接传入score的值,一种是直接在控制台执行弹窗命令
得到了flag