南邮ctf部分 Writeup

常见的术语:

肉鸡:被植入木马的电脑或者是服务器等联网设备。
软件木马:远控软件的被控端(exe文件)
脚本木马:脚本语言编写的被控端(asp、php...)
拿Webshell(有人也会说是:拿shell):拿到网站的最高权限。
服务器:提供计算机服务的设备
{
物理服务器:实体的。
虚拟服务器:常见的,远程连接的。
}
后门:一栋房子有一扇大门跟一个洞。房子=服务器(个人电脑)、大IP=正常权限、洞=后门。
IP:代表计算机的一个网络地址(例子:你在北京,这就是你的地址)
端口:设备与外界通讯交流的出门。(一栋大楼里面有几个房间,房间有几个门
大楼=IP,房间的门=端口)
入侵:利用服务器方面漏洞的技术。
提权:提升权限(拿到了Webshell-》通过Webshell提到服务器的权限,从脚本到服务器)
压力测试(Ddos、CC攻击):利用流量资源攻击服务器。

•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••

1签到题

查看源代码就可以找到flag

2签到2

查看源代码
image.png

让我们输入口令zhimakaimen11个字符,而maxlength=10,通过burpsuite中的Reapeater对页面数据进行修改发送。
maxlength 属性规定输入字段的最大长度,以字符个数计。

maxlength 属性与 <input type="text"> 或 <input type="password"> 配合使用。


image.png

这题不是WEB

打开有个猫的图片,我直接用记事本打开搜索nctf,可以直接找到


丘比龙De女神
image.png

百度MD5:
“简单地说来,就是一种安全策略,在网络上传输数据的时候,如果你是明文进行的话,那么容易受到截获,所以这样说来时很不安全的,所以引入了MD5机制,可以在传输数据的时候,将数据和密钥进行hash生成一个MD5校验值,附加在数据段的首部,那么在对方收到数据是,会将数据段重新用hash算法进行校验,若两个MD5的校验值相同,那么表示数据在传输的过程中没有收到篡改!

flag是照片文件的MD5值,我们就下载MD5 Checksum Verifier软件查看图片的MD5值
image.png

34bc2f23725efa6128f2f3abc0368d92

AAencode

先百度AAencode:
什么是jjencode?
将JS代码转换成只有符号的字符串
什么是aaencode?
将JS代码转换成常用的网络表情。

神器的JavaScript加密工具aaencode 把js转为颜文字表情符号
aaencode 加密
aaencode 解密
把页面代码放到解密里面解密就可以找到flag

图种

图种是什么?通俗来讲就是通过一些小技术将目标文件隐藏于一张图片里面,表面上看起来是一张图片,实际上里面含有其他文件。这种方式可以不受某些网站的限制,便于信息及文件的传递和共享。

将后缀名改为rar,然后用压缩文件打开发现里面藏着一张gif动态图,打开可以发现一些文字:
QQ图片20180112151140.png

最后一段文字是:都深深的出卖了我,首字母为dssdcmlw

nctf{dssdcmlw}

层层递进

【304 Not Modified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
一般的大的站点的图片服务器都有实现HTTP 304 缓存功能。
这个 304 状态一般主要在用户刷新页面(F5键)的时候触发,当用户在刷新页面的时候,因为原来的页面里的很多图片已经缓存过,客户端的浏览器已经记录了图片的最后更新时间(Last Mod),所以在用户刷新页面的时候,会向服务器提交一个字段:If-Modified-Since: Wed, 08 Sep 2010 21:35:06 GMT
这个时候,服务器端的程序先取得这个字段的值,然后与服务器上的图片最后修改时间对比,如果相同,就直接返回 304 Not Modified ,然后停止。这样就不用把图片重新传输到客户端,达到节省带宽的目的。】
打开题目中的网址发现是一个网站的主页,没有其他的提示信息。

查看源代码:
image.png

iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。
iframe中的marginwidth定义 iframe 的左侧和右侧的边距。
marginheight定义 iframe 的顶部和底部的边距。
scrolling会设置是否在在iframe中显示滚动条。
border=0会去掉边框。

你从哪里来

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

单身一百年也没用

当我们直接点击“到这里找KEY”然后再进行抓包时
image.png

找不到异常,

当我们先抓包再点击接着再抓包时候会找到302重定向错误代码:
image.png

这时候可以在响应头中找到flag。
百度302错误代码:302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。

easy!
image.png

直接base64解码

BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据。
这是一种可逆的编码方式。
编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/
共64个字符:26 + 26 + 10 + 1 + 1 = 64。
【注:其实是65个字符,“=”是填充字符】。

Keybord

题目的意思就是键盘,题目也提示看键盘看键盘,那肯定跟键盘有关系。
直接按照题目给出的字母在键盘上画出来图案就会发现对应的字母。
nctf{areuhack}

n次base64

由题目以及提示说编码次数有点多得知flag被base64加密了数次,于是我用在线base64解密工具多次解密就能得到flag:
image.png

COOKIE

打开提示的网站后显示please login first!
这个时候智能抓包,用Burpsuite抓包发现Cookie:login=0

因为上面有个first 我尝试把login=1;然后重新发送 就得到flag
image.png

文件包含

文件包含漏洞的利用
考察PHP封装协议以及PHP文件包含。
在url中添加?file=php://filter/read=convert.base64-encode/resource=index.php,读取到base64加密的index.php文件
注解:
1.php://filter/可用于处理打开的数据流,起到过滤作用。如果源文件为.php则很有可能在前台显示不出来。
2.此时我们采用的方法是,先让文件转化为base64格式(convert.base64-encode)然后再输出,这样不论是什么格式的文件都可以在前台输出。

Download~!

查看页面源代码
图片.png

发现下载地址是base64编码,需要解码解码后发现是两首歌的名字
分析两首歌的文件也没有发现什么
再看看题目和tips


图片.png

图片.png

需要猜到需要下载download.php这个文件,url要用base64编码
图片.png

在if条件里面看到4个或者有3个都已经找到了,就差hereiskey.php。就需要对hereiskey.php进行base64编码然后放到url里面就能找到flag。

MYSQL

Do you know robots.txt?在网址后面加上robots.txt

图片.png

php intval()函数
获取变量的整数值,允许以使用特定的进制返回。默认10进制
注:如果参数为整数,则不做任何处理。

根据TIP和源代码:在网址后输入sql.php?id=1024.1(id只要是1024.后面任意数值都可以)就能找到flag
图片.png

sql injection 3

SQL注入
宽字节注入,双字节绕过
MYSQl宽字节注入

/x00

图片.png

非常重要的php正则表达式详解
@的意思是忽略报错信息
PHP ereg()函数
PHP strpos()函数
PHP中0、空、null和false的总结

空字符串(''),false,NULL和0是值相等而类型不一样!

第一种方法:ereg处理数组,所以这里nctf这里要用nctf[],构造一个arr[],传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,strpos处理数组时,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag
我们还是先说数组 ereg是处理字符串的,所以,按照原理,我们将nctf构造一个arr[],传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,而strpos处理数组,直接返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag。
第二种:ereg的字符串截断漏洞。遇到%00则默认为字符串的结束。
传nctf=1%00%23biubiubiu 接收到1后被截断,后面也有所需要的#biubiubiu,条件成立,拿到flag!

html url编码
为什么要进行URL编码
URL中编码URL特殊字符

bypass again

图片.png

由代码可以知道首先判断a与b的值是否为空,如果不为空就比较a是否!=b,注意这里的!=是弱类型的,如果不想等就继续判断a的MD5值是否等于b的MD5值,如果相等就给出flag

第一种方法:提交两个加密后0e开头的字符串

如果我们定义的相等是== 而不是===,试下 字符串 240610708跟QNKCDZO
所有类似的字符串得到的md5如果是0e打头的,一些语言(PHP)会做隐式转换,当做int类型计算,得到的结果是 0,最后导致0==0,判定为true

第二种方法:md5不能处理数组结构的数据。出错返回null,NULL==NULL。index.php?a[]=1&b[]=2

变量覆盖

变量覆盖漏洞
CTF之php变量覆盖漏洞

图片.png

点开显眼的source.php文件,
图片.png

发现if$pass==$thepassword_123就显示flag。那么就让它们两个相等。
图片.png

PHP是世界上最好的语言
图片.png

PHP eregi函数
如果传进去的id含有hackerDJ就exit(),并且之后会对idURL解码一次再判断与hackerDJ是否相等,如果相等就给出flag。
Url编码,传输过去默认会解码一次,所以我们不能只加密一次,需要加密两次

图片.png

图片.png

伪装者

WEB安全-伪造X-Forwarded-For绕过服务器IP地址过滤
$_SERVER[“HTTP_X_FORWARDED_FOR”] 获得的值是HTTP中 X-Forwarded-For
$_SERVER[“HTTP_CLIENT_IP”] 获得的值是HTTP中 Client-Ip( client-ip书写测试结果:服务器为window环境,则client-ip可以大小写混写。服务器环境为linux,则client-ip必须全部大写)
$_SERVER[“REMOTE_ADDR”] 获得的值为 最后一个跟你的服务器握手的IP,可能会是代理IP或者其他
$_SERVER[“HTTP_REFERER”] 获得的值为 HTTP中的Referer

Headers

关于HTTP协议,一篇就够了

图片.png

上传绕过

要求上传JPG PNG GIF后缀的文件,上传了PNG图片又要求PHP后缀文件

image.png

我们需要把上传的PNG图片让他识别为PHP文件。
截断上传漏洞
典型漏洞归纳之上传漏洞

用burp截断上传文件时候的包在uploads/后面加一个123.php然后发送
image.png

image.png

发现basename等于路径后面的123.php加上了文件名,说明是通过basename判断文件类型的。所以让basename的后缀等于php就可以了。

所以在123.php后面加一个00截断
image.png

在/uoloads/和123.php加个空格便于找到对应的16进制编码,然后将其改为00
image.png
image.png

pass check

PHP strcmp函数
strcmp($pass,$pass1)
strcmp(array,string)=null=0
当不同类型的变量进行比较的时候就会存在变量转换的问题,在转换之后就有可能会存在问题。

图片.png

HTTP常见Content-Type比较
图片.png

用Burp添加POST参数 需要加Content-Type,hackbar应该是会自动添加上去。
首先,只有使用POST方法的时候enctype才生效,GET方法默认使用application/x-www-form-urlencoded编码方法。

HTML meta 中的Content-Type定义的数据类型和编码主要用于网页内容处理时,比如浏览器解析网页内容,或者搜索引擎的爬虫。

Form表单中的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。

起名字真难

图片.png
因为if ( ($digit >= $one) && ($digit <= $nine) )所以输进去的key不能是数字,但是最后还得等于$number == '54975581388'
图片.png

‘54975581388’的16进制是‘ccccccccc’
所以?key=0xccccccccc

密码重置

url中user1=Y3RmdXNlcg%3D%3D,对他进行base64解码发现是ctfuser,而题目要求的是admin。对admin编码
图片.png

然后用burp截断改包
图片.png

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

关于get_magic_quotes_gpc()函数
PHP stripslashes() 函数
PHP之:序列化和反序列化-serialize()和unserialize()
PHP引用(&)使用详解
PHP 的引用允许你用两个变量来指向同一个内容
$a->enter=&$a->secret;

<?php   
class just4fun {  
    var $enter;  
    var $secret;  
    function just4fun()  
    {  
        $a->enter=&$a->secret;
    }  
}  
echo serialize(new just4fun());  
?>

代码跑一下
图片.png

?pass=O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";N;}

综合题

把javascrip转换为jsfuck代码,其中只包含六个不同的字符:!()+[]
转换网址:http://jscrew.it/
把网页中的jsfuck代码转换之后是1bc29b36f623ba82aaf6724fd3b16718.php

图片.png
图片.png

百度history of bash
history介绍及bash命令快速调用
命令记录.bash_history
图片.png
下载这个zip文件
图片.png

密码重置2

查看页面源代码可以找到邮箱:admin@nuptzj.cn
根据提示:linux下一般使用vi编辑器,并且异常退出会留下备份文件。
可能会存在备份文件,一般情况下备份文件一般都是myfile.txt~或者是.myfile.txt.swp,经过测试发现存在.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 "失败了呀";
    }
}
    

根据条件 只要token长度等于10,并且等于0就会给出flag。
让token=0000000000和邮箱一起提交


PHP代码执行函数总结
php 弱类型总结
PHP弱类型的安全问题详细总结