文件包含漏洞,目录遍历漏洞,CSRF,SSRF
目录
文件包含漏洞
目录遍历漏洞
CSRF漏洞
SSRF漏洞
作业
文件包含漏洞
一、概述
文件包含本身是网站的一个正常功能,程序员一般会将重复使用的函数写到单个文件中,需要使用某个函数时直接进行调用此文件,而无需再次进行编写,这种文件调用的过程被称为文件包含。文件包含漏洞是基于功能产生的漏洞,一般情况下,文件会被进行动态调用,这种灵活性,会导致客户端调用恶意文件,造成文件包含漏洞。
二、分类
1、本地文件包含
在同一个服务器中的文件包含则称之为本地文件包含。例如:我的服务器是10.0.0.161,针对于电脑上面的一个文件,对于我的服务器来说,想要包含电脑桌面的一个文件,这不属于同一个服务器,所以不属于本地文件包含。
2、远程文件包含
主要针对的A服务器对于B服务器中文件的包含。远程文件包含漏洞的实现需要php.ini开启了allow_url_fopen和allow_url_include的配置。
allow_url_fopen=on(默认是on)规定是否允许从远程服务器中检索文件;
allow_url_include=on(php5.2之后默认是off)规定是否允许远程文件。
本地文件包含和远程文件包含之间的区别仅仅在于要包含的文件是否在同一个服务器上,如果在同一个服务器上则是本地文件包含,如果没有在同一个服务器上,则说明是远程文件包含。
三、文件包含函数
-
require()
-
include()
-
require_once()
-
include_once()
include和require之间的区别在于include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。虽然说按照概念来说require会更加的安全,但是会影响正常网站的功能。我们本着功能大于安全的角度,所以开发人员一般使用的是include函数。
include_once()指的是只包含一次。
四、敏感参数
URL中如果出现了如下的内容,就可能存在文件包含漏洞。
-
?page=
-
?file=
-
?home=
五、常见的敏感信息的路径
1、windows
c:\boot.ini //查看系统版本 c:\windows\repair\sam //存储windows系统初次安装的密码 c:\programFiles\mysql\my.ini //MySQL配置文件,内置root密码 c:\windows\php.ini //PHP配置文件 c:\windows\system32\inetsrc\MetaBase.xml //IIS配置文件
2、linux
/etc/passwd //账户信息 /etc/shadow //账户密码文件 /usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置 /usr/local/app/php5/lib/php.ini //PHP配置文件 /etc/httpd/conf/httpd.conf //Apache配置文件 /etc/my.cnf //MySQL配置文件
六、如何发现文件包含漏洞
-
观察URL链接是否包含一下类似的关键字:page/include/path/file/url等,如果有,则可能存在文件包含漏洞;
-
观察URL中,出现的赋值参数等号后的内容是否是一个文件,如果是,则可能存在文件包含漏洞;
-
在关键字或者明显被文件赋值的参数处,尝试进行赋值(例如:=http://www.baidu.com ,或者/etc/passwd);
-
配合文件上传进行验证。
七、本地文件包含DVWA演示
1、low等级
-
我们发现URL中出现了敏感的关键词page,我们尝试对其进行赋值,将原本的include.php改为/etc/passwd,查看结果,结果显示出现了配置文件,说明确实存在漏洞。
-
在后端我们和前端的文件目录保持一致。
docker exec -it 7bc9f801d2fa /bin/bash cd /var/www/html/vulnerabilities/fi ls 可以查看到该目录下面的文件
-
在实战的时候我们并不知道当前在哪个目录下面,无法得知绝对路径,在我们挖文件包含漏洞的时候,要么知道绝对路径,要么知道文件名。在实战的过程中,一般情况下,我们是不知道当前目录,也不知道绝对路径,那么这个时候我们就采用相对路径的一种特殊用法:../../../输入足够多的../就可以回到根目录下。如果回到了根目录继续输入../最终也还是根目录,当不知道要输入几个的时候就多输入几个回到根目录下面。
eg page=../../../../../../etc/passwd
2、medium等级
-
在中级的时候会对../进行过滤,但是没有进行重复检测,所以这里我们采用双写来进行绕过。
..././ ....//
3、high等级
-
这个时候我们采用file协议来进行绕过。
page=file:///etc/passwd
八、远程包含文件演示
在本次实验的过程,upload_labs是攻击者的网站,dvwa是目标网站。我们的目的是使得目标网站中的文件包含攻击者网站中的一个文件。
upload-labs pass1--禁用js(F12-F1-勾选禁用js)--上传一个含有phpinfo()语句的文件info.php--复制图像链接--访问
dvwa ?page=复制图像的链接--访问--结果展示有phpinfo的信息。
在dvwa的后端查看dvwa的php的版本,验证一下这个结果是不是目标网站的: docker exec -it 7bc9f801d2fa /bin/bash php -v
在upload-labs中查看当前php的版本 docker exec -it 85d2340d098b /bin/bash php -v
这样子的结果表明了,我们通过文件包含漏洞并没有获取到目标网站dvwa的信息,反而暴露的是自己的网站的信息。这是为什么呢?这是因为我们的这个upload-labs这个网站本身也就是攻击者的网站的本身有php解析器,从而将上传的文件php进行了解析,从而运行出来是攻击者当前的网站的php版本。
解决方案:
方案一,将上传的文件的后缀的php改为txt,但是文件中的内容还是phpinfo(),这样文件在传输的过程中就不会被解析;
方案二:攻击者自己的网站上没有php解析器。
操作步骤和上面的一样,只是上传的那个文件的后缀改为txt。
九、文件包含getshell
1、中间件日志包含绕过
-
原理是web日志会对访问的url进行登记。
-
文件包含的两种方式,一种是文件本地包含(可能无上传点),一种是远程包含(可能会被拦截),当出现上面两种包含方式都进行了限制,应该怎么办?
-
攻击思路:在URL中包含一句话木马,这些都会被web日志进行记录,然后利用文件包含漏洞包含web日志就可以了。
-
-
一般情况下,web日志的文件是/var/log/apache2/access.log
-
所以我们就可以采用在访问该网站的url中插入一句话木马,来使得web文件中有一句话木马,然后使用文件包含漏洞包含web日志,则可以实现getshell。
-
现在web日志中已经包含一句话木马的内容了,下一步,对web日志权限进行修改
chmod 755 /var/log/apache2 chmod 644 /var/log/apache2/access.log
-
修改好权限之后,在含有文件包含漏洞的靶场输入
?page=/var/log/apache2/access.log
-
使用psot方式的一句话木马
2、配合文件上传getshell
这里主要就是利用图片马的形式来进行的。在上一章节中已经 讲过关于图片马的制作,就是访问一张图片,然后图片中包含攻击代码,从而获取信息。
十、文件包含漏洞的防御
1、设置白名单(文件名可以确定)
2、过滤危险字符(判断文件名称是否为合法的php文件)
3、设置文件目录权限(对包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录)
4、关闭危险配置(无需情况下设置allow_url_include和allow_url_fopen为关闭)
目录遍历漏洞
一、知识补充
访问控制在Web应用程序中随处可见,当用户想要执行一个需要身份认证的操作时,一般来说会有如下过程:
-
应用程序首先会判断用户的身份,如进行认证介质、账号密码登录等过程;
-
其次确认发出后续请求时,该用户的身份认证仍然有效;
-
然后还要判断该用户是否被允许执行或访问所请求的资源,如查询信息、交易等。
“判断该用户是否被允许执行或访问所请求的资源”这一过程就是访问控制。常见的访问控制漏洞有水平越权、垂直越权、未授权访问、目录遍历四种。这四种漏洞的原理都不复杂,但都可能会对服务器或其他用户造成较大的危害,因此在设定访问控制策略时,必须慎重考虑。
身份认证是用来判断用户是谁; 访问控制是用来判断用户被允许干什么; 水平越权:张三和李四都是普通用户,张三通过某种方法可以查看李四的信息,则是水平越权; 垂直越权:普通用户通过其他方法可以访问管理员的所有信息则是垂直越权; 未授权访问:不登陆则可以访问页面里面的内容则是未授权访问。(关于未授权访问漏洞的测试:使用burp抓包登录之后的包,构造出一个URL:host+路径,然后打开另外一个浏览器使用构造出来的URL进行访问,如果可以直接登录进去,则说明存在漏洞)
二、概述
1、原理
-
目录遍历也称文件路径遍历、目录穿越、路径穿越等。是由于网站本身存在配置缺陷,导致网站目录可以被任意浏览,从而使得攻击者可以访问到原本不具备权限访问的内容,造成信息泄露,为攻击者实施进一步的网络入侵提供帮助。
-
一般来说,网站会有对服务器文件进行读取查看的功能,大多会用到提交的参数指明文件名,比如
http://www.magedu.com/getfile=test.jpg
当服务器处理传送过来的test.jpg文件名时,会自动添加完整路径,如:
c://site/hack/test.jpg
由于用户输入的文件名可以任意更改且服务器支持“~/”、“../”等目录跳转符,而网站在实现上又没有过滤用户输入的目录跳转符,从而导致攻击者可以拼接路径来遍历服务器上的目录或者文件,造成目录遍历漏洞。
在windows中添加的是..\ 在linux中添加的是../
2、文件包含和目录遍历的区别
-
文件包含是看?page=,?file=,?home=后面是否跟有一个文件名,将文件名进行替换;目录遍历漏洞跟文件包含相似,page=后面跟的不一定是文件名,有时候是目录也会存在目录遍历漏洞。
-
从攻击效果来说:文件包含可以实现getshell,目录遍历则是造成信息泄露。
-
从内容表现来看:文件包含造成的信息泄露,泄露的信息是展示在HTML文件中,而目录遍历引发的泄露可能是泄露文件自身。直接展示的是目录,则一定是目录遍历。
三、如何发现目录遍历漏洞
1、手工测试
-
观察URL中是否有读取查看的功能点,比如文件上传和导入、文件下载和导出、文件删除、文件解压、加载图片等
-
直接访问网站的各种目录(不加文件名和参数),如果以非HTML文件的形式显示了该目录下的文件或者目录信息,证明存在该漏洞。
2、自动化工具扫描
Web漏洞扫描工具都支持目录遍历漏洞的自动化测试,如AWVS,DirBuster等
四、漏洞绕过
1、绝对路径绕过
当应用程序禁止目录跳转符如../,直接将其换成绝对路径实现绕过。 ../../../etc/passwd --> /etc/passwd
2、双写绕过
应用程序通过正则匹配目录跳转符然后进行清楚,但是没有循环检测,所以我们可以使用双写进行绕过。 ../../../etc/passwd --> ..././..././..././etc/passwd
3、编码绕过
应用程序通过正则匹配斜杠/然后清除,可以对/进行编码变成%2f,避免被匹配到,从而实现绕过。但是这种绕过是有使用前提的,那就是当数据传入到服务器的时候会在进行一次编码。(在实战过程中,我们只能进行实验,只是有这么一种方法) ../../../etc/passwd --> ..%2f..%2f..%2fetc..%2fpasswd
4、加密参数绕过
当应用程序对文件名加密后在进行提交,比如程序对文件名进行了base64编码,而攻击者想要绕过,只需要将构造好的路径文件进行base64加密后再附加提交即可。 ../../../etc/passwd ===> Li4vLi4vLi4vZXRjL3Bhc3N3ZA==
5、预期路径绕过
当应用程序仅仅检测路径的开头部分是否预期路径(比如要求开头部分是/var/www/html),如果是预期路径则允许通过,此时可以利用其实预期路径+相对路径的方法来实现绕过 ../../../etc/passwd ===> /var/www/html/../../../etc/passwd
6、00截断绕过
应用程序在读取前,会对提交的文件后缀名进行检测,可以通过在文件名后放一个空字节编码(%00)来绕过文件类型检查。 ../../../etc/passwd ===> ../../../etc/passwd%00.jpg
五、pikachu演示
六、防御方法
-
输入验证与过滤:对于用户输入的文件路径或文件名,进行严格的输入验证和过滤。检查输入中是否包含特殊字符或路径分隔符,并拒绝包含不可信内容的输入。
-
使用白名单:对于文件操作,例如读取、写入或执行等,应使用白名单来限制允许访问的文件或目录,只允许访问预先定义的合法路径。
-
安全文件路径处理:在构造文件路径时,避免直接拼接用户提供的输入。建议使用安全的文件路径处理函数或库,这样可以确保所构造的文件路径是合法且安全的。
-
权限控制:确保文件的访问权限设置正确,仅为需要访问的文件或目录提供最低必要的权限,避免将敏感文件暴露给未授权的用户。
-
安全编程实践:开发人员应遵循安全编程实践,并对用户输入进行充分的验证、过滤和转义。不可信的用户输入应该被视为潜在的目录遍历攻击。
目录常见的存在目录遍历漏洞的中间件及其修复方式如下: IIS 关闭目录浏览功能,在 IIS 的网站属性中,勾去“目录浏览”选项,重启 IIS。 Apache 关闭目录浏览功能,打开 Apache 配置文件 httpd.conf,查找“Options IndexesFollowSymLinks”,修改为“Options -Indexes FollowSymLinks”(减号表示取消),保存 退出,重启 Apache。 Nginx 默认不开启目录浏览功能,若发现开启了该功能,可以编辑 nginx.conf 文件,删除如下两行: autoindex on; autoindex exact size on; 重启Nginx。
CSRF漏洞
一、概述
1、概念
CSRF是跨站请求伪造(xss是跨站脚本攻击),是一种挟持用户在当前已经登录的web应用程序中执行非本意操作的攻击方法,允许攻击者诱导用户在不知情的情况下执行他们并不打算执行的操作。
-
CSRF漏洞的前提是用户已经进行了登录
-
CSRF的攻击效果是用户执行了本不打算执行的操作。
-
该漏洞允许攻击者部分规避同源策略,该策略旨在防止不同网站互相干扰。
2、原理
Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User是正常的用户。 (1)用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A; (2)在用户信息经过验证后,网站A产生cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A; (3)用户未退出网站A之前,在同一个浏览器中打开一个网页访问网站B; (4)网站B在接收到用户的请求后,返回一些攻击代码,并发出一个请求要求用户去访问网站A; (5)浏览器A在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户的cookie信息以用户的权限处理该请求,导致来自网站B的恶意代码被执行。
3、CSRF攻击的三个关键条件
这3个条件是要同时满足的:
-
一个功能操作:如修改密码,修改邮箱等
-
基于cookie的会话处理:网站依赖于cookie值来识别发出请求的用户
-
没有不可预测的请求参数:如网页需要token值或者验证码这些不可预测的请求参数。
如果是post,则必须要写一个html网页诱导用户控制用户向目标网站发送一个post请求。
二、DVWA演示
1、low
low等级中的源代码仅仅验证新的密码是否和确定密码相等,如果相等,则修改密码并且更改数据库,如果不相等,则密码修改失败。
需要准备两个用户,一个是攻击者用户admin,一个是正常用户
在dvwa中查看其他用户的账号和密码 docker exec -it 启动的dvwa的ID /bin/bash mysql show databases; use dvwa; show tables; desc users; select user,password from users; | admin | e10adc3949ba59abbe56e057f20f883e |123456 | gordonb | e99a18c428cb38d5f260853678922e03 |abc123 | 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b |charley | pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |letmein | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 |password 这些密码是经过MD5编码的,这个时候我们在浏览器中找一个网页解码的。 这里我们普通用户使用gordonb,密码是abc123
在火狐浏览器中打开dvwa,用户以admin登录。 进入CSRF漏洞中,进行密码修改,将其修改为6,然后复制修改成功密码之后的URL。
在Edge浏览器打开dvwa,用户以gordonb登录。 在该浏览器中访问刚才复制的URL,会发现gordonb的账号密码变成了6. 验证:使用原来的密码已经无法登录进去,只有使用更改后的a才可以登录进去。
http://10.0.0.161:8080/vulnerabilities/csrf/?password_new=a&password_conf=a&Change=Change# 像这样的URL一般情况下看到password普通人都不会选择点击重新访问,所以我们可以采用短网址链接将URL进行缩短 https://www.ft12.com http://10.0.0.161:8080/vulnerabilities/csrf/?password_new=b&password_conf=b&Change=Change#(将a改成b,便于验证) --> http://985.so/xjck5 使用短链接进行访问,然后也可以发现密码发生了变化,现在使用a这个密码已经登录不进去了,只有使用修改后的b才可以登录进去,说明攻击成功.
2、medium
-
由于sagikazarmark/dvwa在medium中CSRF这一关中的源代码使用的参数是stripos,为了和老师保持一致,我们将靶场更换为citizenstig/dvwa,这个靶场中使用的函数时eregi.
docker pull citizenstig/dvwa docker run -d -p 8084:80 citizenstig/dvwa
-
在low的基础上增加了eregi这个函数来增加安全系数,该函数会在传送过来的字符串中搜索指定的内容.也就是在HTTP报文中搜索referer参数中HOST参数.其中referer参数表示从哪里来的,host表示目标主机的地址,去对比这两个是否一致,也就是判断是否是从用户那里来的.
-
当我们把上图中的referer中的10.0.0.161:8084删掉,这样子host和referer不匹配,则不会修改成功。
绕过方法: 方法一:在修改密码的时候抓包,将referer中的攻击者的地址换成和目标网址一样的host,使得其能够进行匹配。 方法二:攻击者可以申请host的子域名,这样也是可以进行匹配的。 例如:攻击者网址:hack.com 目标网址:www.magedu.com 如果要发起请求,则请求包中的referer一定是hack.com,host是www.magedu.com,这样就没有办法进行匹配。我们可以通过抓包,来讲请求包中的referer修改为magedu.com来进行匹配,从而绕过。
3、high
-
high级别增加了token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发送请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求。
-
绕过方法需要结合xss漏洞一起完成。
A用户(普通用户)在Edge浏览器中登录的gordonb用户: 该网站首先有xss漏洞,在高等级的状况下,获取普通用户所在网页的cookie值 <img src=x Onerror=alert(document.cookie)> cookie值是 PHPSESSID=92c31og7qc314lvj4sp449tui4; security=high
B用户(攻击者): 在自己所在的网站上面进行改密码--抓包--把cookie换成A用户的(这个时候是携带着A用户的cookie)--将安全等级换成low--删掉token--把包放过去--结果用户变成A且密码修改成功
三、Pikachu演示
docker pull area39/pikachu docker run -d -p 8082:80 area39/pikachu
1、电话地址修改CSRF(get)
原理是:一个是A用户vince(攻击者),一个是B用户allen(受害者)。将修改信息的URL进行修改,然后复制URL,在已经登录了allen的浏览器上面进行访问,则会发现B用户的信息被修改了。
操作:
在火狐浏览器上面登录vince账户--修改个人信息--进行抓包--会发现抓到的请求包中有修改的所有信息,我们将第一行的内容进行复制/vul/csrf/csrfget/csrf_get_edit.php?sex=2&phonenum=2&add=2&email=2&submit=submit--将其补全为一个URL-- http://10.0.0.161:8082//vul/csrf/csrfget/csrf_get_edit.php?sex=2&phonenum=2&add=2&email=2&submit=submit--将这个url进行复制。请求包 GET /vul/csrf/csrfget/csrf_get_edit.php?sex=2&phonenum=2&add=2&email=2&submit=submit HTTP/1.1 Host: 10.0.0.161:8082 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Referer: http://10.0.0.161:8082/vul/csrf/csrfget/csrf_get_edit.php Cookie: PHPSESSID=98ljf29bdl4frb010vf8h1nu22; security=high Upgrade-Insecure-Requests: 1 Priority: u=0, i
在Edge浏览器上面登录allen账户--在该浏览器上面访问在火狐浏览器进行信息修改的URL--发现B用户的信息均被修改。
2、钓鱼攻击CSRF(post)
-
在上文说了,如果时post方式的话,则需要写一个html网站诱导用户进行访问。当请求从get变为post的时候,我们不能直接从URL里面进行修改。这时候我们需要制作一个html页面,诱导用户点击,使他直接发送URL请求。(B用户受害者,在B用户所在的浏览器打开这个html制作的网页,则会自动进行内容的修改)。
-
html页面的代码:
<html> <head> <script> window.onload = function() {document.getElementById("postsubmit").click(); } </script> </head> <body> <form method="post" action="http://10.0.0.161:8082/vul/csrf/csrfpost/csrf_post_edit.php"><input id="sex" type="text" name="sex" value="girl" /><input id="phonenum" type="text" name="phonenum" value="100000002" /><input id="add" type="text" name="add" value="hacker" /><input id="email" type="text" name="email" value="magedu@pikachu.com" /><input id="postsubmit" type="submit" name="submit" value="submit" /> </form> </body> </html>
具体的操作:在浏览器中登录一个用户的账号,然后使用vscode写一个poc,然后在该浏览器中直接将这个html网页打开--就会发现信息已经发生了变化。因为这个网页有一个动作就是直接执行了。
四、使用burp生成CSRF的利用POC
不会自己些html网页,则可以利用burp抓包工具,利用generate--csrfpoc来进行生成。
具体操作: pikachu--CSRF(post)--在修改信息的时候进行抓包--然后在burp中右击--Engagement tools--Generate CSRF Poc--选择include auto-submit script--regenerate
五、防御CSRF漏洞
-
防御 CSRF 攻击最可靠的方法是在相关请求中设置CSRF Token:
1. 验证 HTTP Referer 字段
(1)拿到Referer
(2)分割出Referer中的域名
(3)根据后缀匹配域名是否是可信域
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。因此,要防御 CSRF 攻击,网站可以对关键功能的请求验证其 Referer 值,如果是本网站的域名,则说明该请求是来自于网站本身,是合法的;如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
2. 在请求地址中添加 token 并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户的 cookie 来通过安全验证。要防御 CSRF,关键在于请求中需加入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务端建立一个拦截器来验证这个token,如果请求中没有 token 或者 token 内容不正确,则认为可能是CSRF 攻击而拒绝该请求。
3. 添加验证码
验证码被认为是对抗CSRF攻击最简洁有效的防御方法。CSRF攻击的过程,往往是在用户不知情的情况下构造了网络请求。而验证码,则强制用户必须与应用进行交互,才能完成最终请求。因此在通常情况下,验证码能够很好地遏制CSRF攻击。但是验证码并非万能的,很多时候,出于用户体验考虑,网站不能给所有的操作都加上验证码。因此,验证码只能作为防御CSRF的一种辅助手段,而不能作为最主要的解决方案。
六、问题
xss和CSRF都涉及到cookie的利用,在利用方式上有什么区别?
本质区别是:xss是拿到了cookie,CSRF没有拿到cookie,知识利用了cookie。
SSRF漏洞
一、漏洞简介
1、漏洞原理
SSRF是服务端请求伪造(CSRF是客户端请求伪造),是一种由服务端发起请求的一种安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。该漏洞也就是客户端打下WEB,然后让WEB去访问更加内部的内网信息。
2、漏洞危害
-
扫描内网开放服务
-
向内部任意主机的任意端口发送payload来攻击内网
-
DOS攻击
-
攻击内网的Web应用,例如直接SQL注入,XXS攻击等
-
利用file,gopher,dict协议读取本地文件,执行命令等
3、漏洞的难点
-
如何判断这个请求到底是用户发起的还是服务端发起的!
-
那么我们要如何去判断呢?
-
第一步:基于URL进行判断(一个URL中有两个网址的时候要注意)
-
第二步:基于业务去推导请求发起方
-
二、漏洞检测与绕过
1、漏洞检测
有一个漏洞场景:有一个网站可以访问远程的图片,功能链接如下:
http://www.aaa.com/load.php?image=http://www.bbb.com/1.jpg
那么网站请求的大致步骤如下:用户输入图片地址--请求发送到服务端进行解析--服务端发送请求链接地址的图片数据--获取请求的数据加载到前端显示。在这个过程中可能出现问题的点就在于访问请求发送到服务端的时候,图片加载请求是由服务端去加载的,而系统没有校验前端给定的参数是不是允许访问的地址域名,例如,上述链接经过修改可以变为下面这些,从而造成信息泄露。
http://www.xxx.com/load.php?image=http://127.0.0.1:22 http://www.xxx.com/load.php?image=file:///etc/passwd http://www.xxx.com/load.php?image=dict://127.0.0.1:22/data:data2 (dict可以向服务端 口请求data data2) http://www.xxx.com/load.php?image=gopher://127.0.0.1:2233/_test (向2233端口发送数据 test,同样可以发送POST请求)
但是以上链接即使存在也不一定代表这个请求是服务端发起的,所以在判断该漏洞是不是SSRF的时候一定先判断该请求是不是服务端发起的,这是前提条件。
2、漏洞出现点
(1)分享文章
http://share.magedu.com/index.php?url=http://127.0.0.1
(2)图片加载和下载
http://image.magedu.com/image.php?image=http://127.0.0.1
(3)图片、文章收藏功能
http://title.magedu.com/title?title=http://title.magedu.com/as52ps63de
(4)利用参数中的关键字来查找
share wap url link src source target display sourceURl imageURL domain
3、漏洞绕过
(1)限制为http://www.xxx.com域名
可以尝试采用http基本身份认证的方式绕过,通过添加@来构造URL:http://www.aaa.com@www.bbb.com。在对@解析域名时,不同处理函数存在处理差异,例如:http://www.aaa.com@www.bbb.com@www.ccc.com,在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。
(2)限制请求IP不为内网地址
也就是设置黑名单。这个时候我们可以采用短网址的方式来进行绕过。或者可以采用转换为其他进制进行绕过。哪一种进制可以绕过和程序后端的处理逻辑有关系,需要我们不断进行尝试。
(3)限制请求只为http协议
采用短网址进行绕过
(4)利用句号绕过
10.0.0.161--10。0。0。161
三、挖掘SSRF漏洞
-
SSRF漏洞有一个比较麻烦的地方在于:作为测试人员,有时候仅从URL的表现形式并不能判断是客户端还是服务端发起的请求。如果能接触到内网服务器,可以根据源IP来判断是请求方是客户端还是服务端,但很多情况下,测试人员并不具备条件接触内网服务器。
-
观察法
-
Dnslog等工具进行测试,查看是否被访问。http://DNSLog.cn
-
抓包分析发送的请求是不是服务端发送的。(wireshark工具)
-
访问日志检查
-
扫描工具(xray,AWVS)
四、pikachu演示
1、SSRF(curl函数)
curl函数是一个很强大的库,能够向指定资源发送请求,能够连接通讯各种服务器,支持各种协议。
在这里我们将URL后面的重定向网址改为百度的网址 http://10.0.0.161:8082/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/vul/ssrf/ssrf_info/info1.php -->http://10.0.0.161:8082/vul/ssrf/ssrf_curl.php?url=https://www.baidu.com
这里还有一个判断是不是服务端发起请求的方法:那就是如果是服务端发起的请求就会出现上面的那种情况,只有百度的搜索框出现在了当前页面,而不是直接转向了百度的网址。如果是客户端发起的请求,则会直接出现下面的页面(也就是直接跳转到百度的页面去了。)
我们还可以利用file协议读取本地文件 http://10.0.0.161:8082/vul/ssrf/ssrf_curl.php?url=file:///etc/passwd
2、SSRF(file_get_content)
-
file_get_content函数和curl最大的区别就是file_get_content可以实现远程访问,该函数的作用就是把整个文件读入一个字符串中。
-
php://filter可以在访问数据流之前进行过滤,并指定过滤方式,用于对来自非安全来源的数据进行验证和过滤。也就是php://filter以数据流的方式读取文件。
-
php://filter有四个可用参数
-
resource指定了要筛选过滤的数据流,即要读的文件,必需有的
-
read设定一个或者多个过滤器名称,可选
-
write可选
-
<;两个链的筛选列表>任何没有以read=或者write作为前缀的筛选器列表会被视为情况应用于读或者写链。
-
-
file_get_content该函数里面带有php://filter我们可以用它来构造URL
原来的URL:http://10.0.0.161:8082/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/vul/ssrf/ssrf_info/info2.php 改变之后的:http://10.0.0.161:8082/vul/ssrf/ssrf_fgc.php?file=php://filter/resource=ssrf.php(使用这个url进行访问发现会被网站自身解析掉)
所以我们将url再次进行修改:http://10.0.0.161:8082/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php
五、漏洞预防
-
设置URL白名单或者内网IP黑名单。
-
过滤返回信息,验证远程服务器对请求的响应。如果Web应用是去获取某一类型的文件,那么在将返回结果展示给用户之前先验证返回的信息是否合法。
-
禁用不需要的协议,仅仅允许http和https请求,可以防止类似于 file://、gopher://、ftp:// 等引起的问题。
作业
网络安全C10-2024.11.2 作业:(上文中均已经展示了详细的步骤,这里不再赘述)
1、文件包含
(1)DVWA环境下去包含其他目录的任意3个文件,要求使用相对路径
(2)远程文件包含
(3)中间件日志包含绕过,要求使用蚁剑连接成功
2、CSRF
(1)DVWA-High等级
(2)使用Burp生成CSRF利用POC并实现攻击
3、SSRF:ile_get_content实验,要求获取ssrf.php的源码
4、文件包含、目录遍历和SSRF有什么区别?
文件包含的漏洞场景是看file=后面是否跟的是一个文件,且文件包含可以getshell,是一个高危漏洞。目录遍历仅仅只是将所有的目录展示给了非授权人员,file=后面跟的可能是文件,也可能是目录,中危。SSRF主要是由服务端发起的请求,通过服务端向内网发送请求,从而获取更加深层的内网的信息,中危。