常见的术语:
肉鸡:被植入木马的电脑或者是服务器等联网设备。
软件木马:远控软件的被控端(exe文件)
脚本木马:脚本语言编写的被控端(asp、php...)
拿Webshell(有人也会说是:拿shell):拿到网站的最高权限。
服务器:提供计算机服务的设备
{
物理服务器:实体的。
虚拟服务器:常见的,远程连接的。
}
后门:一栋房子有一扇大门跟一个洞。房子=服务器(个人电脑)、大IP=正常权限、洞=后门。
IP:代表计算机的一个网络地址(例子:你在北京,这就是你的地址)
端口:设备与外界通讯交流的出门。(一栋大楼里面有几个房间,房间有几个门
大楼=IP,房间的门=端口)
入侵:利用服务器方面漏洞的技术。
提权:提升权限(拿到了Webshell-》通过Webshell提到服务器的权限,从脚本到服务器)
压力测试(Ddos、CC攻击):利用流量资源攻击服务器。
•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
1签到题
查看源代码就可以找到flag
2签到2
查看源代码让我们输入口令zhimakaimen11个字符,而maxlength=10,通过burpsuite中的Reapeater对页面数据进行修改发送。
maxlength 属性规定输入字段的最大长度,以字符个数计。
maxlength 属性与 <input type="text"> 或 <input type="password"> 配合使用。
这题不是WEB
打开有个猫的图片,我直接用记事本打开搜索nctf,可以直接找到
丘比龙De女神
百度MD5:
“简单地说来,就是一种安全策略,在网络上传输数据的时候,如果你是明文进行的话,那么容易受到截获,所以这样说来时很不安全的,所以引入了MD5机制,可以在传输数据的时候,将数据和密钥进行hash生成一个MD5校验值,附加在数据段的首部,那么在对方收到数据是,会将数据段重新用hash算法进行校验,若两个MD5的校验值相同,那么表示数据在传输的过程中没有收到篡改!
34bc2f23725efa6128f2f3abc0368d92
AAencode
先百度AAencode:
什么是jjencode?
将JS代码转换成只有符号的字符串
什么是aaencode?
将JS代码转换成常用的网络表情。
神器的JavaScript加密工具aaencode 把js转为颜文字表情符号
aaencode 加密
aaencode 解密
把页面代码放到解密里面解密就可以找到flag
图种
图种是什么?通俗来讲就是通过一些小技术将目标文件隐藏于一张图片里面,表面上看起来是一张图片,实际上里面含有其他文件。这种方式可以不受某些网站的限制,便于信息及文件的传递和共享。
最后一段文字是:都深深的出卖了我,首字母为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 ,然后停止。这样就不用把图片重新传输到客户端,达到节省带宽的目的。】
打开题目中的网址发现是一个网站的主页,没有其他的提示信息。
iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。
iframe中的marginwidth定义 iframe 的左侧和右侧的边距。
marginheight定义 iframe 的顶部和底部的边距。
scrolling会设置是否在在iframe中显示滚动条。
border=0会去掉边框。
你从哪里来
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
单身一百年也没用
当我们直接点击“到这里找KEY”然后再进行抓包时找不到异常,
这时候可以在响应头中找到flag。
百度302错误代码:302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。
easy!
直接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:COOKIE
打开提示的网站后显示please login first!
这个时候智能抓包,用Burpsuite抓包发现Cookie:login=0
文件包含
文件包含漏洞的利用
考察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~!
查看页面源代码发现下载地址是base64编码,需要解码解码后发现是两首歌的名字
分析两首歌的文件也没有发现什么
再看看题目和tips
需要猜到需要下载download.php这个文件,url要用base64编码
在if条件里面看到4个或者有3个都已经找到了,就差hereiskey.php。就需要对hereiskey.php进行base64编码然后放到url里面就能找到flag。
MYSQL
Do you know robots.txt?在网址后面加上robots.txt
php intval()函数
获取变量的整数值,允许以使用特定的进制返回。默认10进制
注:如果参数为整数,则不做任何处理。
根据TIP和源代码:在网址后输入sql.php?id=1024.1(id只要是1024.后面任意数值都可以)就能找到flag
sql injection 3
/x00
非常重要的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
由代码可以知道首先判断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
变量覆盖
点开显眼的source.php文件,
发现if$pass==$thepassword_123就显示flag。那么就让它们两个相等。
PHP是世界上最好的语言
PHP eregi函数
如果传进去的id含有hackerDJ就exit(),并且之后会对idURL解码一次再判断与hackerDJ是否相等,如果相等就给出flag。
Url编码,传输过去默认会解码一次,所以我们不能只加密一次,需要加密两次
伪装者
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
上传绕过
要求上传JPG PNG GIF后缀的文件,上传了PNG图片又要求PHP后缀文件
我们需要把上传的PNG图片让他识别为PHP文件。
截断上传漏洞
典型漏洞归纳之上传漏洞 用burp截断上传文件时候的包在uploads/后面加一个123.php然后发送
发现basename等于路径后面的123.php加上了文件名,说明是通过basename判断文件类型的。所以让basename的后缀等于php就可以了。
pass check
PHP strcmp函数
strcmp($pass,$pass1)
strcmp(array,string)=null=0
当不同类型的变量进行比较的时候就会存在变量转换的问题,在转换之后就有可能会存在问题。
HTTP常见Content-Type比较
用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 值)。
起名字真难
‘54975581388’的16进制是‘ccccccccc’
所以?key=0xccccccccc
密码重置
url中user1=Y3RmdXNlcg%3D%3D,对他进行base64解码发现是ctfuser,而题目要求的是admin。对admin编码然后用burp截断改包
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());
?>
代码跑一下?pass=O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";N;}
综合题
把javascrip转换为jsfuck代码,其中只包含六个不同的字符:!()+[]
转换网址:http://jscrew.it/
把网页中的jsfuck代码转换之后是1bc29b36f623ba82aaf6724fd3b16718.php
百度history of bash
history介绍及bash命令快速调用
命令记录.bash_history
密码重置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和邮箱一起提交