简单总结Web安全面试中的基础知识

0x01 前言

网络和Github上有很多安全相关的面试经验,但部分考点并没有参考的答题思路和解析,本人根据自己的面试经验和知识,对网络资料和自己遇到的题目进行整理。如有不足,请多指正。

0x02 Web安全基础知识点

SQL注入

原理

SQL注入的形成通常是因为未检测或未充分检测用户的输入部分,导致被黑客构造输入对代码进行截断然后执行自己的SQL指令,对数据库敏感数据进行查询。

注入的类型

  • 布尔型注入
  • 报错型注入
  • 可联合查询注入
  • 基于时间延迟的注入
布尔型注入

布尔型注入是通过判断页面的返回情况来获得信息。

利用案例:xxx/view?id=1 and substring(version(),1,1)=5

如果服务端MySQL版本是5.X的话,那么页面返回的内容就会跟正常请求一样。攻击者就可以通过这种方式获取到MySQL的各类信息。

报错型注入

根据页面的报错获得信息。

构造非法的SQL指令,根据页面返回的报错进行调试。

可联合查询的注入

指的是可以使用UNION情况的注入,可以直接构造多条联合指令。

基于时间延迟的注入

条件语句查看时间延迟来判断语句是否执行(即页面返回时间是否增加)。

宽字节注入

由于数据库使用GBK编码,网站使用utf-8编码,payload%df%27

绕过WAF的思路

  • 通过注释绕过:添加/**/来绕过关键字拦截

  • 空白字符:部分字符在SQL里是空白字符,可以用其替代sql语句中的空格(+,-,~,!,``,.1)

    1
    2
    3
    4
    5
    SQLite3 0A 0D 0C 09 20 
    MySQL5 09 0A 0B 0C 0D A0 20
    PosgresSQL 0A 0D 0C 09 20
    Oracle 11g 00 0A 0D 0C 09 20
    MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
  • 使用SQL内置函数或者关键字

  • %0a换行

防御SQL注入

  • 过滤输入
  • 规范编码
  • 关闭框架debug

sqlmap的利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-u 单个URL -m xx.txt 多个URL
-d "mysql://user:password@10.10.10.137:3306/dvwa" 作为服务器客户端,直接连接数据库
--data post/get都适用
-p 指定扫描的参数
-r 读取文件
-f 指纹信息
--tamper 混淆脚本,用于应用层过滤
--cookie --user-agent --host等等http头的修改
--threads 并发线程 默认为1
--dbms MySQL<5.0> 指定数据库或版本

–level=LEVEL 执行测试的等级(1-5,默认为 1)
–risk=RISK 执行测试的风险(0-3,默认为 1) Risk升高可造成数据被篡改等风险
–current-db / 获取当前数据库名称
–dbs 枚举数据库管理系统数据库
–tables 枚举 DBMS 数据库中的表
–columns 枚举 DBMS 数据库表列
-D DB 要进行枚举的数据库名
-T TBL 要进行枚举的数据库表
-C COL 要进行枚举的数据库列
-U USER 用来进行枚举的数据库用户

XSS

XSS类型

  • 反射型XSS:你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码;(直接在输入的位置使用<?php echo xxx?>
  • 存储型XSS:你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;(将xss攻击代码写入数据库,每次访问都会执行)
  • DOM型XSS:你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子;(常用的alert)

CSRF

简介

对于 CSRF,其两个关键点是跨站点的请求请求的伪造,由于目标站无 token 或 referer 防御,导致用户的敏感操作的每一个参数都可以被攻击者获知,攻击者即可以伪造一个完全一样的请求以用户的身份达到恶意目的。

攻击方式

利用 HTML 元素发出 CSRF 请求,这是最常见的 CSRF 攻击。HTML 中能设置 src/href 等链接地址的标签都可以发起一个 GET 请求,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<link href="">
<img src="">
<img lowsrc="">
<img dynsrc="">
<meta http-equiv="refresh" content="0; url=">
<iframe src="">
<frame src="">
<script src=""></script>
<bgsound src=""></bgsound>
<embed src=""></bgsound>
<video src=""></video>
<audio src=""></audio>
<a href=""></a>
<table background=""></table>
......

还有 CSS 样式中的:

1
2
3
@import ""
background:url("")
......

也可使用表单来对 POST 型的请求进行伪造。

1
2
3
4
5
6
7
8
9
10
<form action="http://www.a.com/register" id="register" method="post">
<input type=text name="username" value="" />
<input type=password name="password" value="" />
</form>
<script>
var f = document.getElementById("register");
f.inputs[0].value = "test";
f.inputs[1].value = "passwd";
f.submit();
</script>

同源策略

定义

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。

规避同源策略
  • JSONP的劫持
  • CORS(跨源资源分享)

防御方式

  • 加验证码(强制交互)
  • 验证来源Referer(策略要严谨,也要防止空Referer)
  • 使用随机token(表单一旦提交,token销毁)

SSRF

原理

利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。

伪协议

  • 利用 file 协议读取本地文件
  • 利用dict协议查看端口
  • 利用gopher协议攻击redis反弹shell

文件包含漏洞

PHP文件包含函数

  • include() :使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
  • inclue_once() :功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
  • require():使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。
  • require_once() :功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

利用思路

  • 本地文件包含:在log中插入执行代码,文件包含时即执行
  • 远程文静包含:由于在php.ini中开启allow_url_includeallow_url_fopen选项。开启后可以直接执行任意代码。可以利用该漏洞远程包含shell等。

文件上传漏洞

解析漏洞

IIS 解析漏洞

IIS6.0 在解析文件时存在以下两个解析漏洞 。

  • 当建立 .asa 、.asp 格式的文件夹时 , 其目录下的任意文件豆浆被 IIS 当作 asp 文件 来解析 .

  • 在 IIS6.0 下 , 分 号 后面 的 扩 展 名 不 会 被 解 析 , 也 就 是 说 当 文 件 为 *.asp;.jpg时,IIS6.0 同样会以 ASP脚本来执行 。

Apache 解析漏洞

在 Apache 1.x 和 Apache 2.x 中存在解析漏洞 , 但他们与 IIS 解析漏洞不同。

Apache 在解析文件时有一个规则 : 当碰到不认识的扩展名时 , 将会从后向前解析 , 直到 碰到认识的扩展名位置 , 如果都不认识 , 则会暴露其源码 . 比如 :

php.rar.xx.aa

Apache 首先会解析 aa 扩展名 , 如果不认识则接着解析 xx 扩展名 , 这样一直遍历到认识 的扩展名为止 , 然后再将其进行解析 .

PHP CGI 解析漏洞

在 PHP的配置文件中有一个关键的选项 : cgi.fi: x_pathinfo. 这个选项在某些版本是默认开启的 , 在开启时访问 url, 比如 :http://www.xxx.com/x.txt/x.php,x.php 是不存在的 文件 , 所以 php 将会向前递归解析 , 于是就造成了解析漏洞 . 由于这种漏洞常见于 IIS7.0 、 IIS7.5 、 Nginx 等 Web服务器 , 所以经常会被误认为是这些 Web服务器的解析漏洞 。

Nginx <8.03 空字节代码执行漏洞

影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37

Nginx 在图片中嵌入 PHP代码 , 然后通过访问 xxx.jpg%00.php 可以执行其中的代码 。

其他

在 windows 环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类文件都是不允许存在的 , 若这样命 名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在文件名后加一个空格或者点绕过 黑名单 . 若上传成功 , 空格和点都会被 windows 自动消除 , 这样也可以 getshell。

如果在 Apache 中 .htaccess 可被执行 . 且可被上传 . 那可以尝试在 .htaccess 中写入 :

SetHandlerapplication/x-httpd-php

然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php 文件 。

0x03 一些面试问答

  1. @eval的@什么意思

    @符号可以在任何表达式前面使用,即任何有值或者可以计算出值的表达式之前,用于忽略错误和警告信息。

  2. sqlmap中os-shell和web-shell的区别

    os-shell是将脚本插入到数据库中,然后生成相应的代码文件,获取shell即可执行命令。web-shell是单纯的动态脚本执行文件。

  3. 解释一下location.hash

    一般情况下为URL后 “#” 及其后面一部分组成,如http://www.test.com/#/something,其中http://www.test.com为真实的路径,而#/something则为网页中的位置,称之为**锚点**。由于location.hash是可读可写的,当hash值改变时,触发onhashchange事件。location.hash与HTML5 history类似,都能够在改变页面的URL而不会引起浏览器的重载。但是location.hash支持比较早的浏览器,而history是在HTML5的新API,可能某些较早的浏览器不支持

0x04 参考资料

文件上传漏洞的原理、危害及防御

ctf-wiki

Leezj9671的技术面分享

location.hash详解

**注释:部分内容直接copy,如有侵权请联系删除