Web安全面试经验
零、前言
前段时间主要在准备春招和某个比赛,春招面试了几家大厂,最终选择去阿里。面试是个历练和学习的过程,这里将一些经验和题目分享一下,因为直接透漏面/笔试题目可能不太好,因此这里仅分享一些通用性的题目,有些题目并没有标准答案,可以一起讨论。
一、安全
1、SQL注入的原理是什么
用户可控的参数拼接到SQL语句中,导致数据操作时执行了额外的SQL语句。
2、SQL盲注有哪些类型,盲注如何利用
SQL盲注一般分为基于布尔的盲注和基于时间的盲注。
时间盲注相关函数:BENCHMARK(100000,MD5(1)) 、sleep(5)、笛卡儿积
https://p0sec.net/index.php/archives/117/
https://www.cdxy.me/?p=789
使用dnslog可以更方便的获取数据,此方法仅限于windows平台,使用load_file()函数发起dns请求。
https://www.cnblogs.com/afanti/p/8047530.html
3、SQL报错注入常用的函数有哪些
floor()+count()+group by、exp()、extractvalue()、updatexml()+substr()、name_const()
https://www.freebuf.com/articles/web/175049.html
报错的原理:
https://www.cnblogs.com/xdans/p/5412468.html
4、SQL注入绕过相关
过滤空格:%09 %0a %0b %0c %0d %a0 /**/
过滤逗号:
a、对于substr()、min()可以使用from for语句
select substr(user(),1,1) 等价于 select substr(user() from 1 for 1)
b、联合查询的字段使用join
union select 1,2 等价于 union select * from (select 1)a join(select 2)b
c、使用like
select substr(user(),1,1) == ‘r’ 等价于 select user() like “r%”
d、对于linit可以使用offset
select * from table limit 0,1 等价于 select * from table limit 1 offset 1
过滤单引号:
a、十六进制
‘user’=>0x7573657273
b、宽字节
过滤等号:
a、<> : ?id=’ and 1<>1
b、like : ?id=’ and select user() like ‘r%’
c、greatest : ?id=’ union select greatest(substr(select user(),1,1),98)
5、order by 后的注入(头条,科恩)
a、无limit
select * from user order by id and select extracvalue(concat(0x7e,(select user()),0x7e))
b、有limit
select * from user order by id limit 1,1 procedure analyse(extractvalue(1,concat(0x7e,user())),1)
5、如何防止SQL注入
a、参数过滤
b、SQL预编译
c、存储过程
d、使用框架API
6、预编译的原理是什么
这里的预编译是在数据库层面做的,使用预编译的时候客户端会首先将SQL语句模板发送到数据库进行编译,然后在将接收到的参数值填充到已经编译好的模板中(根据占位符),进行变量绑定,这样变量的值就不会改变SQL语句的结构。这里有个链接:
https://www.zhihu.com/question/43581628
一个更好理解的解释:
采用了PreparedStatement,就会将sql语句:”select id, no from user where id=?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。
注意:预编译无法防御order by后面的注入,因为order by参数化传入后不会被执行,因此只能拼接,可能会造成注入。
7、反射型XSS与DOMXSS的区别
反射型与DOM型XSS一般都是通过构造特定的URL来攻击,反射型在用户点击时会在返回的页面触发,而DOM型一般是在前端js处理DOM节点时动态产生的,它不会经过后端处理。
8、如何防御XSS
a、httponly
b、输入检查
c、输出检查(html encode、js encode)
d、使用模板引擎
e、CSP(内容安全策略)
9、CSRF的原理什么
当用户登陆A网站且登陆凭据未消失时,黑客可以在在B站设置恶意的请求操作,诱导用户访问B站,用户在访问B站时会在不知情的情况下自动向A站发送恶意请求。
10、如何防止CSRF
a、关键操作设置验证码
b、检查referer
d、设置token
11、XXE漏洞原理及防御
原理
xml是一种文本格式,用以数据存储和交互。其中实体是定义文本或字符的变量,实体可以从内部或外部引用。外部引用就是通过SYSTEM关键词引入一个地址,这个地址就是实体的位置,它可以是一个本地文件或者是一个外部文件。
防御
过滤xml数据;
在解析xml时禁止解析外部实体。
12、SSRF漏洞以及一些协议
原理:服务端请求伪造,模拟服务器,向内网发起请求从而进行攻击。
协议:http、https、ftp、file、gopher、dict
https://blog.chaitin.cn/gopher-attack-surfaces/
13、PHP变量覆盖漏洞及预防原理
函数:
a、全局变量覆盖
b、$$
c、extract
d、parse_str
e、import_request_variables
防御:做判断,已存在的变量不覆盖
14、PHP代码执行函数
函数:
a、eval
b、assert
c、preg_replace
d、call_user_func
e、动态函数调用
15、静态代码审计工具的原理
1、遍历所有文件,寻找请求处理/逻辑处理代码文件,忽略类定义/函数定义的文件
2、对文件进行数据搜索,统计变量/函数(危险函数、安全函数)定义信息、编码信息以及过滤信息等,生成摘要文件
3、对代码进行编译分析,生成抽象语法树、控制流图等
4、根据数据搜索的信息,寻找危险函数的调用位置,进行溯源和污点追踪,判断是否可控、是否存在函数过滤
5、输出报告
https://blog.csdn.net/u011721501/article/details/46271551
16、反序列化漏洞的原理及防御
原理:
序列化是对对象的操作,使其便于在网络中传输或存储,反序列化就是将其还原的过程。以Python为例,如果对象存在__reduce__()魔术方法,那么在反序列化中就是自动执行其中的代码,造成代码执行。
场景:
以Django为例,Django中的session一般会存储在数据库、文件或者cookie中,在cookie中是序列化之后的数据。那么就可以构造POC通过session攻击django。
防御:
1、检测输入端的数据
2、在反序列化的时候执行白名单检测,hook __reduce__()函数,不允许危险函数执行
https://blog.csdn.net/yanghuan313/article/details/65010925
17、Python沙箱逃逸
1、花式导入:__import__() importlib
2、编码:base64、rot13等
3、SSTI
18、Django安全机制
https://www.leavesongs.com/PENETRATION/python-string-format-vulnerability.html
http://xxlegend.com/2015/04/01/Django%E5%AE%89%E5%85%A8%E6%9C%BA%E5%88%B6/
19、Mysql写shell的思路有哪些
a、ouffile函数导出一句话(需要写文件权限并知道网站路径)
b、开启mysql日志,向日志写shell
20、Mysql 提权的思路有哪些,什么原理
a、UDF提权(root权限)
UDF即是User Define Function,我们通过上传一个dll文件(里面包含了自定义的函数),然后在数据库里通过CREATE FUNCTION来调用这个dll,就可以使用其中的函数然后执行系统命令。实际上就是利用MySQL的高权限进行提权。
b、MOF提权(导出文件权限、mof写权限、win2003及以下)
MOF是用来进行进程监控的文件,每隔5秒执行一次,具有系统权限,那么我们就可以通过mysql向mof的目录ouf_file一个mof函数,其中包含写好的提权脚本,即可完成提权。
c、启动项提权(root权限、导出文件权限)
在开机启动项写入VBS脚本
21、密码找回可能涉及的逻辑漏洞
a、凭据泄露
b、凭据可猜解
c、跳转逻辑可修改
d、用户混淆
https://www.freebuf.com/articles/web/176211.html
22、收集域名信息的方法
a、爆破猜解
b、搜索引擎
c、DNS记录
d、爬虫搜索
e、ip、邮箱、whois反查
f、https证书
g、威胁情报接口
23、寻找域名真实的IP
a、子域名查询
b、PDNS
c、邮件订阅(目标站点给自己发邮件,在邮件头可获得真实ip)
d、漏洞造成的信息泄露
e、根据网站功能诱导网站访问目标服务器
24、CSP、CORS
CSP:内容安全策略:限定当前网页允许加载资源的源
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP
CSP严格动态:
https://blog.cal1.cn/post/0CTF%202018%20Quals%20Bl0g%20writeup
CORS:跨域资源共享:设置跨域资源请求的策略
25、代码审计的思路
1、用户输入入手,追踪变量,判断每一处代码逻辑是否可以利用,可能是一个函数或条件判断
2、从危险函数入手,逆向追踪可疑的参数,看那些用户可控的变量是否可利用
3、根据前端功能点,定向审计
26、渗透的思路,给你一个站如何入手
1)信息收集
a. 服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等)
b. 网站指纹识别(包括,cms,cdn,证书等),dns记录
c. whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等)
d. 子域名收集,旁站查询(有授权可渗透),C段等
e. google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等
f. 扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等
i. 传输协议,通用漏洞,exp,github源码等
2)漏洞挖掘
a、 浏览网站,看看网站规模,功能,特点等
b.、端口,弱口令,目录等扫描
c.、XSS,SQL注入,命令注入,CSRF,cookie安全检测,敏感信息,通信数据传输,暴力破解,任意文件上传,越权访问,未授权访问,目录遍历,文件 包含,重放攻击(短信轰炸),服务器漏洞检测,最后使用漏扫工具等
3)漏洞利用 | 权限提升
4)清除测试数据 | 输出报告
a.、日志、测试数据的清理
b.、总结,输出渗透测试报告,附修复方案
27、内网渗透思路
理解什么域,什么是工作组
https://www.freebuf.com/company-information/172630.html
28、内网渗透中如何隐蔽的回传数据
https://www.cnblogs.com/LittleHann/p/8656621.html
29、什么是水坑攻击
一般是针对政府、金融等高级目标的攻击,通过收集目标信息,查看目标经常访问的一些网站、服务等,然后攻破这些系统,修改其功能。当目标去访问时会对目标执行恶意操作。
30、DDOS的种类及其原理
a、ICMP Flood:向目标主机发送大量ICMP报文
b、NTP Flood:NTP是基于UDP的网络时间同步协议,攻击者攻击时构造特殊的数据包,将目的ip指向NTP服务器,源ip设定未目标服务器,当NTP响应的时候会将数据包全部打到目标服务器。然后利用一些指令进行放大攻击,比如monlist会返回最近与NTP同步过时间的服务器,那么就会产生大量的响应报文。
c、SYN Flood:利用三次握手原理,向服务器发送大量建立TCP的请求报文,但是不进行回应,也就是第三次握手不完成,导致服务器需要维护大量的半连接,从而造成资源的消耗。
d、DNS Flood:发送大量DNS解析请求,造成DNS服务器资源耗尽,使其他Web服务无法被解析。
31、DDOS判定的一些方法
a、查看服务器运行状态,比如CPU占用,网卡速率
b、查看服务运行状态,是否卡慢、无法访问等
c、分析流量,看是否有大量异常连接,比如TCP半连接,单个IP高数量的链接
32、DDOS防御的一些手段
a、关闭一些不必要的服务和端口
b、流量清洗,一些设备
c、与运营商合作,进行分流
d、分布式集群部署,单台服务器配置多个ip
e、DNS解析防御、CDN
33、Docker与虚拟机的区别
传统虚拟机是在宿主机操作系统上再虚拟出一个完整的操作系,然后基于这个虚拟的系统提供服务。Docker实现了对宿主机操作系统的共享,只需要在Docker引擎上运行容器即可。容器基于沙箱机制,容器之间的资源和进程完全隔离。因此相比于虚拟机,Docker更快也更轻量级,同时又能保证安全性。
34、Docker的安全性问题
Docker的安全性是指Docker容器是否会对宿主机造成影响,是否会对其他容器产生影响。Docker的安全性主要靠隔离来实现的,它的隔离是基于Linux的namespace,但是namespace的环境本身并不是完全隔离的,比如一些文件、设备、命令执行结果等,所以相比传统的虚拟机,Docker的安全性要差一些。从攻击角度主要有以下几个方面:
a、Docker源:恶意镜像、镜像中存在漏洞软件、中间人篡改镜像
b、Dockers架构缺陷及本身安全问题:自身的一些CVE,信息泄露,权限绕过等
https://www.sohu.com/a/156307982_411876
https://www.freebuf.com/articles/system/69809.html
二、项目
项目根据自己的实际情况梳理清楚,一定要说的明白。用到了哪些技术栈、相比类似的产品/项目有哪些创新,关键问题如何解决等。
三、其他
1、编程,根据自己所熟悉的语言准备即可,比我我熟悉python,可能会问到python爬虫的实现。
2、算法,常见的刷题中的算法,比如快排、递归以及动归等;如果简历写了机器学习也要准备常见的算法。
3、论文,如果面试前有一篇自己的论文,面试官会很愿意聊。
4、经历,比如比赛、实习等。