文件上传
客户端check
们可以看到,刚把文件上传,还没有点击“开始上传”就已将弹出了警示框,没有交互就已经检测了文件的类型,说明他是在前端进行校验的。
那么我们看一下代码:
选择浏览,可以看到代码中有一个checkfiletxt()的函数:
我们尝试看一下这个函数,果然是他,然后把onchange值改为空,将这个函数删除:
再次尝试上传php文件,发现成功上传。(但是只要重新刷新页面,代码就会恢复。)
服务端check
尝试上传php文件,点击上传发现禁止上传,提示只能是图片格式:
由于Content-Type字段里面的MEMI类型是上传文件的类型,那么我们可以尝试抓包,更改其MEMI类型:
多用途Internet邮件扩展(MIME)类型 是一种标准化的方式来表示文档的性质和格式。浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;因此服务器设置正确以将正确的MIME类型附加到响应对象的头部是非常重要的。
上图的MIME类型带变得就是应用程序, 其中图片的MEMI类型一般为:
image/jpeg
image/png
image/gif
那么我们可以更改为要求里的其中一个,发现上传成功:
imagesize
我们像上一个一样,尝试修改MIME类型后上传:
他提示后缀名不能为空,那就是说后缀名必须为图片文件格式的后缀,我们在更改一下:
发现还是不可以,看来他还加了文件头的校验。
那么我们在本来的内容上面一行,加入gif图片的文件头:GIF89a
这次发现成功上传,但是因为文件格式为png,就不能直接使用shell工具连接了,需要配合文件包含来使用.
XXE
pikachu官方介绍:
XXE注入漏洞就是:攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题。也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。
首先我们得了解什么是xml文档,XML是传递数据的一种格式,是用于存储和传输数据的语言。与HTML一样,XML使用标签和数据的树状结构。但不同的是,XML不使用预定义标记,因此可以为标记指定描述数据的名称。
一个xml例子(XML声明+DTD文档类型定义+文档元素):
///xml声明
<?xml version="1.0"?>
///DTD文档类型定义
<!DOCTYPE note[
///外部实体声明
<!ENTITY entity-name SYSTEM "URI/URL">
]>
///文档元素
<note>
<to>Jerry</to>
<from>Tom</from>
<head>Reminder</head>
<body>hello</body>
</note>
其中外部实体声明中的URL可以使用file://协议,因此可以从文件加载外部实体,这样就会造成一些敏感文件被解析加载。
如果我们设置payload:
<?xml version = "1.0"?>
<!DOCTYPE way [
<!ENTITY y SYSTEM "file:///C:/Windows//win.ini">
]>
<way>&y;</way>
那么它就会把win.ini文件解析进来(如果是linux系统就换成etc/passwd等),回显到页面上,从而获取一些敏感文件信息:
不安全的url跳转
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。
这是有五个跳转链接:
当我们点击最后一个链接后,可以看到已经跳转,且链接中url=i:
这种情况下,我们就可以将url的参数修改,替换成我们的恶意链接,做成钓鱼链接让目标点击。比如我将url=http://www.baidu.com,可以看到直接跳转到了百度页面: