刷题学习记录

[LitCTF 2023]Ping

知识点:前端检测

前端有限制,众所周知前端的限制只是为了前端用户可以输入有效的数据,让后端减小开销,更好的处理数据。

 前端验证是通过对客户端输入数据的合法性进行检查来确保数据是有效且安全的。通常,它会通过一系列简单的规则,如长度检查、格式检查、正则表达式匹配等,验证用户输入是否符合要求,以提高应用程序的安全性和可用性。

前端检测,也称为前端验证或客户端验证,是指在用户界面上对用户输入的数据进行验证和验证的过程。它是在用户提交数据到服务器之前,在客户端(通常是在浏览器中)进行的验证过程。

前端检测主要用于验证用户输入的数据是否符合特定的要求和限制。它可以用于确保用户输入的数据格式正确、完整性和合法性,并提供即时的错误提示和反馈。

前端检测通常基于前端开发技术,如HTML、CSS和JavaScript。通过在前端代码中编写验证逻辑和规则,可以确保用户输入的数据满足特定的要求,如必填字段、最小长度、最大长度、数据格式等。

"whoami"是一个常见的命令行命令,通常用于显示当前登录用户的用户名。当您在命令行中输入"whoami"并按下回车键时,系统将返回当前用户的用户名作为输出。

 解题

进入环境,要求ping一个IP地址,先用127.0.0.1试一下

刷题学习记录_第1张图片

 用管道符尝试查看一下根目录

127.0.0.1|ls

刷题学习记录_第2张图片

 多试了几次管道符,猜测是前端检测,利用burp抓包然后改包

command=127.0.0.1|whoami&ping=Ping

刷题学习记录_第3张图片

 查看根目录,发现flag文件

command=127.0.0.1;ls /&ping=Ping

刷题学习记录_第4张图片

 查看flag文件

command=127.0.0.1;cat /flag&ping=Ping

刷题学习记录_第5张图片

 NSSCTF{301d61d3-bf0d-4526-9853-6837a152ae32}

[LitCTF 2023]作业管理系统

知识点:文件上传+弱口令

进入环境,是一个登录框,大概是登录完成后进行文件上传

刷题学习记录_第6张图片

 先查看源码,发现账户登录是弱口令登录admin/admin

刷题学习记录_第7张图片

 找到上传口开始文件上传

刷题学习记录_第8张图片

 文件上传成功

刷题学习记录_第9张图片

 用蚁剑连接就可以找到flag

[SWPUCTF 2022 新生赛]ez_ez_php

知识点:PHP伪协议+文件包含

进入环境得到源码

 

if ( substr($_GET["file"], 0, 3) === "php" ) {: 如果GET参数 file 的前三个字符是 “php”

这段代码是一个简单的文件包含漏洞示例。它接受一个名为 file 的GET参数,并根据参数的值来包含不同的文件。如果参数以 “php” 开头,则会包含相应的文件并执行其中的代码,否则会输出 “Hacker!!”。如果没有传递 file 参数,代码会将自身的源代码进行语法高亮显示。

 看到这个三等号,我想到了用php://filter协议(php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了)

?file=php://filter/read=convert.base64-encode/resource=flag.php

刷题学习记录_第10张图片

 将得到的base64进行解码,提到用php伪协议,但是一开始就用到了php伪协议

刷题学习记录_第11张图片

 一、用php伪协议rot13解出本题

?file=php://filter/write=string.rot13/resource=flag

刷题学习记录_第12张图片

 二、php伪协议读取文件的时候,直接读取flag再进行base64解码,而不用读取flag.php

?file=php://filter/read=convert.base64-encode/resource=flag

刷题学习记录_第13张图片

 刷题学习记录_第14张图片

笔记

php伪协议参考:file_put_content和死亡·杂糅代码之缘 - 先知社区

rot13

尽管base64比较特别,但是并不是所有的编码都受限于‘=’,这里可以采用rot13编码即可;

php://filter/write=string.rot13||/resource=s1mple.php这里的rot13编码即为,所以这里可以进行写入;载荷效果如下:

 

e1ba0c6f5fb596edd8ef66a19d47cb06.png

其原理就是利用转码从而将原本的死亡代码进行转码从而使引擎无法识别从而避免死亡代码;

 

[NSSCTF 2022 Spring Recruit]babyphp

知识点:数组绕过+弱比较

解题

进入环境拿到源码

  

 解析:

if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a']))

 在PHP中,intval()函数不能直接识别数组。intval()函数是用于获取变量的整数值,它可以识别字符串或数字类型的变量,并将其转换为整数。如果你尝试将一个数组传递给intval()函数,它将返回0。

 if(isset($_POST['b1'])&&$_POST['b2']){
        if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2']))

首先,使用isset()函数检查$_POST数组中是否存在名为"b1"和"b2"的元素。如果两个元素都存在且非空,将执行if语句中的操作。if语句的第二个条件判断用户输入的"b1"和"b2"的值是否相等,且md5加密后是否相等。如果这两个条件都成立,就会被视为通过了校验,可以执行后续操作。

 if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2']))

首先,通过比较P​OST[′c1′]和POST[‘c2’]的值来判断它们是否相等,同时使用is_string()函数确保两个值都是字符串类型。if语句的第三个条件使用md5加密对和P​OST[′c1′]和POST[‘c2’]的值进行比较,判断它们的加密后的结果是否相等。如果这个条件也满足,就会被视为通过了校验,可以执行后续操作。

is_string()函数在PHP中用于检测一个变量是否为字符串类型。它只能用于检测一个变量是否是一个普通的字符串,而不会将数组识别为字符串。

如果传递给is_string()函数的参数是一个数组,is_string()函数会返回false,因为数组不是字符串类型。需要传入值是字符串且md5值相等

刷题学习记录_第15张图片

payload:

a[]=1&b1[]=1&b2[]=2&c1=QNKCDZO&c2=240610708

得到flag

刷题学习记录_第16张图片

 

 

你可能感兴趣的:(学习)