OWASP2017…
主要是XSS的下降和XXE、反序列化的上升以及CSRF的落榜。
说明什么?
-
Web安全体系在逐渐完善,因此XSS与CSRF此类疏忽型漏洞地位下降,即便有此漏洞,很多自动化、默认化的防御手段已经可以防治此漏洞带来的危害。与之相对的是SQLi,多年长青,因其危险性。
-
XXE. 和一个表哥的探讨过程中发现,此漏洞的跨平台性,如今Android盛行,xml作为其组件,利用姿势更多了.so....
主要是XSS的下降和XXE、反序列化的上升以及CSRF的落榜。
说明什么?
Web安全体系在逐渐完善,因此XSS与CSRF此类疏忽型漏洞地位下降,即便有此漏洞,很多自动化、默认化的防御手段已经可以防治此漏洞带来的危害。与之相对的是SQLi,多年长青,因其危险性。
XXE. 和一个表哥的探讨过程中发现,此漏洞的跨平台性,如今Android盛行,xml作为其组件,利用姿势更多了.so....
听大佬们教诲,技术提高最好要弄一个个人的独立blog,有个空间去纪录自己学习的心得,有个地方可以写自己妙手偶得的思路。于是,笔者便用vps+lnmp+wordpress这种可以说是最简便的方式搭建了一个个人独立blog。
但即便是最简便的方式,也会有着各种各样容易出现的错误。
0x00 域名
建议在godaddy买,在国内要备案。
如果只是玩票的话,几块钱就可以买个不常用的后缀比如.space的买一年,.com的一般100左右两年,看个人需求。
买到后可以把域名解析换到DNSpod,解析会快很多。
服务器配置好后,添加一个A记录到自己的服务器即可。
0x01 服务器选择
在我建站之前,因为搭ss已经租下了vps,所以,在选服务器这个环节倒没有费什么心思。不过其实也差不多,搭ss的服务器选择标准,网站基本也适用。
快,便宜,免过多的个人信息绑定,我觉得就够了。如此标准之下,我选了Vultr的日本机房,速度相对较快。延迟能稳定在100ms左右。
买vps时建议先加个ssh key,后期登陆会方便很多。
此处有一点经验之谈,vps一定要多试几台,有的ip已被墙,有的虽未被墙但延迟极高。推荐用本地ping加站长工具多地ping测试。
顺便附上一份搭ss用的shell,秋水逸冰大佬做的,亲测好用:
0x02 服务器环境搭建
vps弄好了然后登录即可,使用的Xshell,可以连上文中所添加的ssh,也可以直接root+控制面板密码登陆。
这里有一点提醒,以后备份恢复后登陆密码会是之前的控制面版密码(前提未改),如果没有ssh会挺麻烦。
环境搭建,无非数据库加http服务器加PHP,我用的是lnmp(linux+nginx+mysql+php)
shell附上:
screen -S lnmp
wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.tar.gz && tar zxf lnmp1.3-full.tar.gz && cd lnmp1.3-full && ./install.sh lnmp
安装过程中没有难点,基本上读设置说明就非常明了。
而后lnmp vhost add增加一个vhost,建议加完www.xxxx.com 这种域名后,在下一个追加项里把xxxx.com 加上。还有就是把伪静态规则要开启,不然后期开启会比较麻烦。
这样,一个网站所需要的服务环境就完成了。
下面要做的就是把网站文件放到上文所建立的vhost中,默认情况下,/home/wwwroot目录下www.xxxx.com 文件夹即网站目录。
在这里,我用的是号称5分钟建站的wordpress,下载wordpress模板到服务器,文件解压至网站根目录即可。
将服务器ip添加A纪录至解析方,直接输入域名即可进入安装页面,填写服务器名及密码等字段点击下一步后即完成搭建。
0x03 网站优化
墙内的Wordpress用户切记,wordpress默认加载的的Google字体和全球头像问题会大大拖慢加载速度。
安装两插件即可关闭:
Disable Google Fonts 禁用谷歌字体
WP-DuoShuo-Gravatar 替换全球头像服务
安装Wordpress插件WP Fastest Cache以开启缓存,可大幅提高速度。(需开启伪静态。)
去年创新立项的时候扬言要写一篇科研论文。如今结题日将至,却依旧难有明确的思路。老师说,先把目前所做的工作总结一下,写写论文。那我也只能用写作的方式把自己的一些不成熟的想法记述下来,看看能否有所突破。
这一年,读过一些论文,知道XSS的攻击方式、过滤手段,基本情况还算清晰,问题在于如何创新。
暂时有两个思路,不知道能不能想出来其他的。。。
其一,Fuzzing。在fuzzing基础上,加一些新的东西,譬如《基于Fuzzing技术提升XSS漏洞防御水平的研究》一文,将轻型ids引入xss防御系统。
我的想法是引入异步爬虫,也就是在爬虫效率上做文章。不知是否可行,但以我目前的认知,爬虫绝非关键。
其二,机器学习,自动攻击向量生成。前些天和一个表哥聊天,聊到安全建模,突然萌生了这么个想法,以机器学习演化payload,让机器学习寻找可能存在xss的点。
但限于个人水平加上学习机器学习也需要一定周期。此方法基本否决。
其实感觉科研也没有一开始想的那么严谨,反而感觉有些微妙。单看题目,有的时候都能明白这是篇好论文还是水论文。老技术,哪来的创新了。。。还是说大佬都发EI、SCI去了。。。
目前最可行的方案还是fuzzing,再引入些新东西。
目前最大的问题还是在于软件及其测试。
代码能力还不够,思路不够清晰
fuzzing可以和什么结合起来呢?
从整个防御体系看?反爬虫?IDS?认证体制诸如数字指纹?
从算法看?
从Web结构看?
yi mi wa ga nai
果然还是发现写出来比干想强的多,写写一个弱鸡对XSS的一些感觉吧。
TCP/IP通常被认为是一个四层协议系统。
结构如是:
应用层 | Telnet、FTP、e-mail等 |
---|---|
传输层 | TCP和UDP |
网络层 | IP、ICMP和IGMP |
链路层 | 设备驱动程序及接口卡 |
每层功能:
网络层:
处理分组在网络中的活动,如分组选路等。
在TCP/IP中,网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议)、IGMP协议(Internet组管理协议)。
运输层:
为两台主机上的应用程序提供端到端的通信。
在TCP/IP中,有两个互不相同的传输协议,TCP(传输控制协议)、UDP(用户数据报协议)。
TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。
应用层:
负责处理特定的应用程序细节。
几乎各种不同的TCP/IP实现都会提供通用的应用程序:
此图可以划分出端系统( End system )(两边的两台主机)和中间系统(Intermediate system)(中间的路由器)。应用层和运输层使用端到端(End-to-end)协议。在图中,只有端系统需要这两层协议。但是,网络层提供的却是逐跳(Hop-by-hop)协议,两个端系统和每个中间系统都要使用它。
虽然TCP使用不可靠的IP服务,但它却提供一种可靠的运输层服务。
UDP为应用程序发送和接收数据报。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。但是与TCP不同的是,UDP是不可靠的,它不能保证数据报能安全无误地到达最终目的。
IP是网络层上的主要协议,同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的I P层在互联网中进行传输。
ICMP是IP协议的附属协议。 IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。
ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
互联网上的每个接口必须有一个唯一的 Internet地址(也称作IP地址)。 IP地址长 32 bit。Internet地址并不采用平面形式的地址空间,如 1、2、3等。 IP地址具有一定的结构,五类不同的互联网地址格式如图所示:
这些32位的地址通常写成四个十进制的数,其中每个整数对应一个字节。这种表示方法称作“点分十进制表示法。
区分各类地址的最简单方法是看它的第一个十进制整数:
类型 | 范围 |
---|---|
A | 0.0.0.0 - 127.255.255.255 |
B | 128.0.0.0 - 191.255.255.255 |
C | 192.0.0.0 - 223.255.255.255 |
D | 224.0.0.0 - 239.255.255.255 |
E | 240.0.0.0 - 247.255.255.255 |
多接口主机具有多个IP地址,其中每个接口都对应一个IP地址。
在TCP/IP领域中,域名系统(DNS)是一个分布的数据库,由它来提供IP地址和主机名之间的映射信息。
任何应用程序都可以调用一个标准的库函数来查看给定名字的主机的I P地址。类似地,系统还提供一个逆函数—给定主机的IP地址,查看它所对应的主机名。
大多数使用主机名作为参数的应用程序也可以把IP地址作为参数。
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。
TCP传给IP的数据单元称作TCP报文段或简称为 TCP段(TCP segment)。IP传给网络接口层的数据单元称作 IP数据报(IP datagram)。通过以太网传输的比特流称作帧(Frame)。
封装过程:
大部分网络应用程序在编写时都假设一端是客户,另一端是服务器,其目的是为了让服务器为客户提供一些特定的服务。可以将这种服务分为两种类型:重复型或并发型。
并发:
C1. 等待一个客户请求的到来。
C2. 启动一个新的服务器来处理这个客户的请求。在这期间可能生成一个新的进程、任务或线程,并依赖底层操作系统的支持。这个步骤如何进行取决于操作系统。生成的新服务器对客户的全部请求进行处理。处理结束后,终止这个新服务器。
C3. 返回C1步。
并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。也就是说,每个客户都有它自己对应的服务器。如果操作系统允许多任务,那么就可以同时为多个客户服务。
TCP服务器是并发的,而UDP服务器是重复的,但也存在一些例外。
TCP和UDP采用16 bit的端口号来识别应用程序。
服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP (简单文件传送协议)服务器的UDP端口号都是69。任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号。
客户端通常对它所使用的端口号并不关心,只需保证该端口号在本机上是唯一的就可以了。客户端口号又称作临时端口号(即存在时间很短暂)。因为它通常只是在用户运行该客户程序时才存在,而服务器则只要主机开着的,其服务就运行。
所有关于 Internet的正式标准都以RFC(Request for Comment)文档出版。
发送此mail即获得一份RFC方法清单
To: rfc-info@ISI.EDU
Subject: getting rfcs
help: ways_to_get_rfcs
两种API
实验吧昨天放了三个新题,随便选了个misc的做了一下。虽然有些坑,但还是比较不错的一道题。
隐藏在数据包中的秘密
解题链接: http://ctf5.shiyanbar.com/misc/LOL/LOL.pcapng
数据包,基本上都是可以导出些什么东西,然后进行接下来的求解。这道题也不例外。
导出http的文件,有两个upload.php比较可疑,进入其中可以观察到,一个是上传了lol.zip一个是lol.docx。
前者是正确方向,后者是错误的。
打开lol.zip文件,发现是加密的。正常思维首先会以为密码在另一个文件里面,对,没错,我就是这么掉进坑的。
word文档其本质就是一个压缩包。所以可以把docx文件以压缩包形式打开,最终在document.xml里可以找到一副图片和一句话,大意就是这里风景很美好,但不是想要的。现在看来,这就是说这个方向是错误的,当时没有想到,还做了很久的图片隐写。。。。
zip文件用winhex看一下,会发现头上的加密位是未加密的状态,那么肯定就是在文件目录区所修改的伪加密了。
果不其然,在文件目录区修改伪加密位即可解压文件。
发现是4个16进制文本,扔到解密站看看,看到了png文件头,那大致就明白了,winhex做成png文件即可。
会发现是4个二位码的四个部分,ps拼接之,扫码,得flag。
主要是想看看我老婆
另:
附上伪加密知识点:
压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志
压缩源文件数据区:
50 4B 03 04:这是头文件标记(0x04034b50)
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密)
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
00 00:扩展记录长度
压缩源文件目录区:
50 4B 01 02:目录中文件文件头标记(0x02014b50)
3F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
24 00:扩展字段长度
00 00:文件注释长度
00 00:磁盘开始号
00 00:内部文件属性
20 00 00 00:外部文件属性
00 00 00 00:局部头部偏移量
压缩源文件目录结束标志:
50 4B 05 06:目录结束标记
00 00:当前磁盘编号
00 00:目录区开始磁盘编号
01 00:本磁盘上纪录总数
01 00:目录区中纪录总数
59 00 00 00:目录区尺寸大小
3E 00 00 00:目录区对第一张磁盘的偏移量
00 00:ZIP 文件注释长度
这次CTF做的可以说很憋屈了。唉,辛辛苦苦两天,愣是没做出来一道题,最后全靠学弟做出来一道逆向才避免了光头的尴尬。
、
Web弱鸡也就做做Web、MISC,以后再学学可能做做Crypto。
太菜了。
题目给了一篇论文
《Keyless dynamic optimal multi-bit image steganography using energetic pixels》Goutam Paul著
Google了一下,发现有一个Github项目叫BusySteg。
down下来之后,看了一下,要安opencv,然后cmake编译运行即可。
然后我就死在了安opencv的过程中。
看过Write up之后,发现。。。我果然好菜。。QAQ
我没做出来签到题,所以这次比赛算没打的。。。。。
QAQ
题目是一道test.php
稍微扫了一下,发现网站参数就这么一个。www.baidu.com
然后一想,肯定是用协议做文章,很自然的想到file协议,而后。。。我就陷入了试127.0.0.1 、localhost的误区。
也曾想到网站后加子目录,但始终没想明白为何wp里payload会是file://www.baidu.com/etc/flag?
尤其是那个etc。
现在算是明白了,问了出题人,说随便放的,因为都会去试etc/passwd文件。。。。。然后就有线索了,这个文件的最后会有路径。。。我怎么就没想着试试。。。。。
扫一下目录知道了存在login.php、admin.php两个文件,访问admin.php发现有权限控制,login.php是登录界面。
还扫到了弱口令,账号密码admin,可以进admin.php
这里,wp里说,可以通过login.php和admin.php的备份文件即.php.swp获得备份文件。
以此获得源码。
显然,我没找到。。。。
login.php源码:
function get_identity(){
global $id;
$token = get_random_token();
$c = openssl_encrypt($id, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $token);
$_SESSION['id'] = base64_encode($c);
setcookie("token", base64_encode($token));
if($id==='admin'){
$_SESSION['isadmin'] = 1;
}else{
$_SESSION['isadmin'] = 0;
}
}
function test_identity(){
if (isset($_SESSION['id'])) {
$c = base64_decode($_SESSION['id']);
$token = base64_decode($_COOKIE["token"]);
if($u = openssl_decrypt($c, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $token)){
if ($u === 'admin') {
$_SESSION['isadmin'] = 1;
return 1;
}
}else{
die("Error!");
}
}
return 0;
}
可以看到在session中也做了身份验证,但是由于加密模式是aes-128-cbc
,且$token
在cookie里,可控,所以这里可以进行Pading Oracle Attack,通过修改$token
可以把$_SESSION['isadmin']
改为1,如此,即可登入admin.php。
学习了,Pading Oracle Attack。出题大佬的blog此文:http://f1sh.site/2017/08/04/%E5%88%9D%E5%AD%A6padding-oracle-attack/
admin.php源码:
if(isset($_GET['id'])){
$id = mysql_real_escape_string($_GET['id']);
if(isset($_GET['title'])){
$title = mysql_real_escape_string($_GET['title']);
$title = sprintf("AND title='%s'", $title);
}else{
$title = '';
}
$sql = sprintf("SELECT * FROM article WHERE id='%s' $title", $id);
$result = mysql_query($sql,$con);
$row = mysql_fetch_array($result);
if(isset($row['title'])&&isset($row['content'])){
echo "<h1>".$row['title']."</h1><br>".$row['content'];
die();
}else{
die("This article does not exist.");
}
wp说此处可以利用PHP格式化字符串的漏洞。在PHP的sprintf这个函数中%\会被当成一个格式化字符串。
%\会被认为是个tan 90'的格式化字符串,输出空,so,可以传入title=%' or 1#
,转义,拼接
sprintf("SELECT * FROM article WHERE id='%s' AND title='%\' or 1#'", $id);
这样%就会吃掉后面的\组成一个格式化字符串,单引号就成功逃逸了出来。
娘希匹,想不到,真的想不到。。。。
只是这样的话还是会报错参数不足,因为这条代码里有两个格式化字符串但是只有一个参数。不过PHP的格式化字符串还有另一种表示方法%1$s,其中%后面的数字就表示引用第几个参数,$后面是格式化字符串的类型。
传入title=%1$' or 1#
时:
sprintf("SELECT * FROM article WHERE id='%s' AND title='%1$\' or 1#'", $id);
最终payload:
?id=0&title=%251%24'%20union%20select%201%2C2%2C3%23
注入时也有一个小坑,key这个表名是MYSQL保留字,我们把它当做表名带入查询时必须用反引号包起来。
需要确认的信息:
目标用户
譬如CMS管理员、客服、普通用户、黑客/安全人员等,可综合利用社工等。
预期效果
明确每一阶段的效果,如获取Cookies、添加一篇文章、传播网马、盗取密码、破坏数据等。
XSSprobe:https://github.com/evilcos/xssprobe
通过此工具可以获取目标页面的通用数据。
如:browser、ua(user-agent)、lang(language)、referer、location、toplocation(父类location)、Cookie、domain(目标页面域名)、title、screen(屏幕分辨率)、flash(flash插件版本信息).
1.可能泄露token
2.可能邪路sid
rel = "noreferrer"属性,可以让请求不带Referer。目前仅chrome支持(WebKit内核)。趋势
<a href="http://www.foo.com/" rel="noreferrer">noreferrer!</a>
可以通过dom操作获取。
问了一下做java ee的实验室老哥他们的记住密码机制是用token发到服务端从nosql里读取。
有价值
用处不大,不如劫持表单方便,如onchange、onblur、onclick等。
且仅能在全英文输入(ASCII)情况下使用,存在中文输入框时,记录不了击键事件。
若想做完美,需融入表单项等事件的监听机制。
绕过noscript插件,可通过网站“私信模块”。
主要是Web层面(主要是JavaScript)内网渗透。
内网IP 有一比较好方式---Java Applet,但需要JRE支持。
MyAddress.class是Java Applet文件,功能就是通过Java获取内网地址,然后调用上层的JavaScript函数MyAddress,将获得的IP显示出来。
可通过跨域AJAX技巧或Web Socket方法实现IP端口获取。
Image对象请求时,得到资源(非法)就onerror,否则timeout.
var m=new Image();
m.onerror = function(){
if(!m)return;
m = undefined; alter("open");};
m.onload = m.onerror;
m.src='http://'+host+':'+port;
setTimeout(function(){
if(!m)return;
m = undefined; alert("close");
},900);
}
原理:
其他浏览器XMLHttpRequest跨域请求
onreadystatechange - 根据时间差来判断,timeout则fail
资源:
http://ha.ckers.prg/weird/xhr-ping-sweep.html
http://securethoughts.com/security/ie8xdr/ie8xdr-ping-sweep.html
相较nmap
<img>
简单CSRF修改各种配置,如:迅捷FW300R
<img src =http://192.168.10.1/userRpm/ManageControlRpn.htm?port=80$ip=255.255.255.255&Save=%C8%B7+%B6%A8
<pre class="line-numbers prism-highlight" data-start="1"><code class="language-null"><br /><br />- 被动:通过referer泄露内网Web应用信息
- 这些内网应用可能有:
- bbs/blog/trac/wiki/oa/mail/project/webim/web_vuls_vm
- 有开源有闭源
- 这些Web应用有不同种类的漏洞,如果是xss+sql:
- xss inject攻击脚本
- 攻击脚本AJAX请求SQL注入,得到想要的数据,返回。
# 7.4 基于CSRF的攻击
- 基于CSRF的SQL注入
- 基于CSRF的命令执行
- 基于CSRF的XSS攻击
- 基于CSRF的攻击类似于“借刀杀人”。
# 7.5 浏览器劫持
劫持用户点击链接操作,打开新窗口的时候注入攻击者的JavaScript脚本,以达到将XSS威胁延续到同域内的其他页面。
# 7.6 跨域操作
浏览器相关缺陷导致的跨域,即使已修补,可举一反三。
### 7.6.1.IE res:协议跨域
探测本地域是否存在目的软件
P232 POC
7.6.2. CSS String Injection跨域
www.a.con/test.html代码:
```html
<body>
{}body{font-family:
aaaaaaaaaaaa
bbbbbbbbbbbbbb
</body>
攻击者页面:www.b.com/test2.html:
<style>
@import url("http://www.a.com/test.html");
</style>
<script>
setTimeout(function(){
var t = document.body.currentStyle.fontFamily;
alert(t);
},2000);
</script>
@import 导入外域CSS文件,本身正常行为。IE通过document.body.currenStyle.fontFamily方式访问目标样式的font-family属性,其值恰为font-family之后的所有内容。
为CSS高容错性导致。
浏览器为了支持更多方便的功能,往往需要一些特权区域存在,这些特权是相对浏览器的Internet域来说的,比如扩展、插件能够和本地系统打交道,一些功能页面也有和本地系统打交道的能力。
- 如果我们的XSS能够跨到特权区域里,即可做更多更大权限的操作。
此过程称之为Cross Zone Scripting或Cross Context Scripting(XCS)
浏览器为了丰富自身功能,允许第三方提供各类插件或扩展,但扩展权限如果没有控制好,就会带来很严重的后果。
如chrome插件speed dial2 存在DOM XSS,通过这个XSS可以越权操作,导致各种严重的信息泄露问题。
speed dial2 会将用户访问的链接信息储存在localstorage中,其中有一个关键字是_closed_tabs
,这个关键字的值储存了最近关闭的链接信息,如url、title,其中title如果存在恶意脚本,就会触发DOM XSS。
很多网站会把不同的子业务方放到不同的子域下,如:
www.foo.com
app.foo.com
blog.foo.com
message.foo.com
但在这些子域下总会存在一个类似proxy.html的文件,文件内有如下代码:
<script>document.domain="foo.com";</script>
有一个合法的性质是,这个页面可以设置document.domain为当前子域或比当前子域更高级的域。一般顶级就到了根域,如果设置为其他域,浏览器就会报权限错误。
可利用WebKit内核浏览器的一个缺陷(由sog 1发现),导致顶级域为域名后缀,如foo.com的域名后缀是com。
通过Internet域(http协议)的代码,比如<iframe>
标签利用file协议调用本地的XSS漏洞页面,并通过这个本地XSS执行任意的JavaScript代码,由于是file协议,所以权限会更大。
IE可以通过UNC方式(“统一命名约定”地址用于确定保存在网络服务器上的文件位置)访问本地文件,如:
file:////127.0.0.1
由于是UNC方式,浏览器以为是Internet域,就允许访问,如此便触发了跨协议。如本地文件存在xss漏洞,则可以别调用触发。
已修补,可自行搜索研究。
用到了基于浏览器的远程控制。
要实现远程控制,必须具备两个条件:
- 远程指令要可以在目标浏览器上“实时执行”。
- 执行结果要能够让控制端看到。
<script>
内容可跨域,合法,请求到的数据必须是合法的JavaScript语法格式。
请求回来的是JSON+CallBack函数这样的数据内容(这种跨域数据通信被称为JSONP)
结合JavaScript的setInterval函数,间隔几秒向远控服务端指令接口请求数据,而服务端可以根据控制者的需求生成指令到中间存储文件中(如数据库、内存、文件系统等)由这个指令接口统一调度这些生成的指令。
注入的脚本文件是一个服务端动态文件,也就是服务端指令接口,每次都会返回控制着生成的指令内容,如果没有指令,则返回空内容。
缺陷:这个XSS Proxy模型大多数时间,被控浏览器发起的服务端指令接口请求都是无用功,因为很可能并没有指令内容,控制者不会每隔3秒发出一个指令。
也需要setInterval主动发起服务端指令接口请求。
唯一的好处是,异步发起,更加安静。
持久性的socket连接,在浏览器客户端通过JavaScript进行初始化连接后,就可以监听相关的事件和调用socket方法来对服务端的消息进行读写操作。
这种连接可跨域,至少可以拿来做远控,客户端监听onmessage事件,就能及时响应来自服务端发送过来的指令。
是客户端最直接的跨文档传输方法。一般用在iframe中父页与子页之间的客户端通信。
用Nginx的网站伪静态开启比较麻烦,我查找网网上各种各样解决方案,仅有一方法可行。
即编辑vhost下网站配置:
# 譬如本站:
vi /usr/local/nginx/conf/vhost/www.harmoc.com.conf
在最后一个}前添加:
#ignored: “-” thing used or unknown variable in regex/rew
rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ permanent;
if (-f $request_filename){
set $rule_2 1;
}
if (-d $request_filename){
set $rule_2 1;
}
if ($rule_2 = "1"){
#ignored: “-” thing used or unknown variable in regex/rew
}
rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 last;
rewrite ^/([_0-9a-zA-Z-]+/)?(.*.php)$ /$2 last;
rewrite /. /index.php last;
墙内的Wordpress用户切记,wordpress默认加载的的Google字体和全球头像问题会大大拖慢加载速度。
安装这两个插件即可关闭:
Disable Google Fonts 禁用谷歌字体
WP-DuoShuo-Gravatar 替换全球头像服务
安装Wordpress插件WP Fastest Cache以开启缓存,可大幅提高速度。
注:此插件需开启伪静态。
97年出生的小明用自己的生日作为自己网站的密码, 现在, 得到一串被篡改过一个字符的字符串, 你能解出小明的生日吗?
0175501585710a89h5a60dc9ed2f88d7
其实很简单的题,比赛时候就看出来思路,可惜python没写好,hashlib用的不行。没做出来。
思路:
测试97年所有的日期的hash即可,然后与之对比。
重点在hashlib库的使用如事前encode等问题。
还有if s[:10] in md5:这种比较方式应用。
#python 3.6.3
import hashlib
s = '0175501585710a89h5a60dc9ed2f88d7'
for i in range(1,32):
for j in range(1,13):
date = '1997{1}{0}'.format(i, j)
m = hashlib.md5()
m.update(date.encode("utf8"))
md5 = m.hexdigest()
print ("loading")
if s[:10] in md5:
print (md5)
print (date)
已知仿射加密变换为c=(11m+7) mod26, 试对密文dikxourxd解密。
和上一题一样,个人问题在于python编写能力不足。
或者说当时被卡题心态有些崩了,只想着用手算了。
算法思想不难,也就是暴力解出。把每个字母作为m试一次然后把c和密文对比即可,取其相对应字母,连起即明文。
#python2.7
a = 'dikxourxd'
a1=[]
for i in a:
a2 = ord(i)-97
a1.append(a2)
print a1
for i in a1:
for j in range(0,26):
c = (11*j+7)%26
if(c==i):
print chr(j+97)
这道题就开始真正的摸不着思路了。
看过WP才清楚原来提示中的pyhton和Linux是整合文件用这个的意思。
思路:
1.导出http包
2.发现几个flag文件
3.用cat或者Python整合文件
4.解包(此处考察了伪加密,但在kali下可直接解压)
要点:
Wireshark导出http包部分的使用,或者说wireshark的使用。(确实得好好看一下wireshark的相关详细姿势了,每次都是做到新题才知道一种新用法。)
cat命令或python来整合文件。
黑客利用漏洞从Web系统中窃取了什么机密信息?
当时查flag字段,看出是注入,没看出是猜解。
思路:
打开查看是Apache日志, 查找flag关键词, 发现是通过延时盲注读取了flag表的内容。 写代码解决问题。
urldecode之后, 可发现对每个
字符猜解的最后一个数据包当中用!=做判断。 利用正则过滤出正确猜解的字符的ascii。 第一条为查询数据的条数, 后面为flag表的内容。
代码如下:
import urllib
import re
flag = ''
flag_list = []
with open('access.log', 'r') as file:
#print file.read()
line_lists = file.readlines()
#print len(line_lists)
flag_lines = []
for i in line_lists:
if 'flag' in i:
flag_lines.append(i)
#print len(flag_lines)
for i in flag_lines:
s = i.split(" ")[6]
s=urllib.unquote(s)
if '!=' in s :
print s
p = re.compile(r'!=[1-9]\d*')
flag = flag + chr(int(p.findall(s)[0].replace('!=','')))
print flag
没什么别的可说的,当时做不出来是对SQL注入理解不行。
这道题的题点应该就是Sqli机制和正则匹配了。
这道题出的太脑洞了。没遇见过这类题就很难做出来。
题点是文件头数据块IHDR:
包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,且一个PNG数据流中只能有一个文件头数据块。
文件头数据由13字节组成,结构如下:
本题中 IHDR位原本是0000061E 0000031E
看详细信息里应当是1566×798,相应的16进制就应该是
0000061E 0000051E
修改后,图片显示flag。
真的想不到。
以后就能想到了。
这个题当时竟然都没看一下。今天做了一下。
给了两个图片一个xor.png,一个flag.png,看到xor文件名知道是异或运算。
def xor(str1, str2):
return ''.join(chr(ord(x) ^ ord(y)) for x, y in zip(str1,str2))
for i in range(20):
#png_1 = open(sys.argv[1], "rb").read(i)
png_1 = open("xor.png", "rb").read(i)
png_2 = open("flag.png", "rb").read(i)
key = xor(png_1, png_2)
print key