WEB常见漏洞
SQL注入
定义:由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
本质:对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。
1 | $name=$_POST['username']; |
构造payload:1’ or ‘1’ =’1 时:
select * from admin where user=’admin’ and password=’1’ or ‘1’ =1’
数字型:输入参数为整型。
字符型:输入参数为字符串。
sqlmap常用命令
1 | python sqlmap.py -u 注入点 --dbs |
防御:
- 关闭应用的错误提示
- 加waf
- 对输入进行过滤
- 限制输入长度
- 限制好数据库的权限
- 对sql语句进行预编译处理
- 对数据库数据进行信息加密
XSS
定义:当攻击者使用Web应用程序将恶意代码发送给不同的最终用户时,就会发生XSS攻击。允许这些攻击成功的缺陷非常普遍,并且发生在Web应用程序反映用户输入而无需验证或编码的任何地方
本质:由于WEB服务端读取了用户可控数据输出到HTML页面的过程没有进行安全处理导致的。
反射型:存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码一般不存储到服务端。
存储型:这是利用起来最方便的跨站类型,跨站代码存储于服务端
DOM:这是由于客户端脚本自身解析不正确导致的安全问题
1 | <IMG SRC=javascript:alert('XSS')> |
修复方案:
对输出数据使用HTMLEncode对一些字符做转义处理
全局拦截,适用于不包含富文本的情况
富文本交互,白名单过滤
文件上传
定义:利用上传漏洞可以把ASP,PHP等格式的木马直接上传至网站目录内,一旦上传成功,可以立刻得到WEBSHELL权限
本质:服务器端没有对用户上传的文件类型做校验或者校验不完整,导致用户可以上传恶意脚本到服务器。
1 | //asp |
客户端校验:
- JavaScript校验等————修改客户端代码/上传过程修改数据包
服务端校验:
- MIME类型————上传过程修改MIME类型
- 文件内容————上传图片木马/代码混淆
- 扩展名校验————特殊扩展名/截断上传/解析漏洞等
防御:
- 服务端采用白名单方式检查文件扩展名。
- 上传的文件名随机命名
- 上传文件的目录必须是http请求无法直接访问到的,如果需要访问的,必须上传到其他域名下,并设置该目录为不解析脚本语言的目录
- 上传文件需要做日志记录
文件包含
常见函数
- include()
- include_once()
- require()
- require_once()
include与require的区别:
include只有当代码执行到此函数时才将文件包含进来,而require只要程序执行就立即调用此函数包含文件。
防御:
- 禁止远程文件包含allow_url_include=off
- 配置open_basedir=指定目录,限制访问区域
- 过滤../等特殊字符
- 修改apache日志文件的存放地址
- 开启魔术引号magic_quotes_qpc=on
- 尽量不要使用动态变量调用文件,直接写要包含的文件
CSRF
原理:CSRF跨站点请求伪造。攻击者盗用了受害者的身份,以受害主的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作。
防护:
- 尽量使用POST,限制GET
- 验证http referer字段,确认源地址
- 添加token验证
- 将 cookie设置为 HttpOnly
SSRF
原理:利用一个可以发起网络请求的服务当作跳板来攻击内部其他任务
- file: 查看文件
- dict: 协议探测端口
- ophergopher: 支持GET&POST请求
防御:
- 地址做白名单处理
- 域名识别IP,过滤内部IP
- 校验返回的内容对比是否与假定的一致
逻辑漏洞
常见类型:
交易支付、密码修改、密码找回、越权修改、越权查询、突破限制等
XXE
原理: 解析用户传入的xml
防御:
- 过滤用户提交的XML数据
libxml_disable_entity_loader=true
代码执行漏洞
原理:没有对接口输入的内容进行严格的判断,使得攻击者能精心构造代码进行非法执行
常见函数:
- php:eval assert
- python: exec
- asp: <%=CreateObject(“wscript.shell”).exec(“cmd.exe /c ipconfig”). StdOut. ReadAll()%>
防御:
- 使用json保存数组,这样读取时就不需要使用eval了
- 对于必须使用eval的地方,一定要严格处理用户数据
- 字符串使用单引号包括可控代码,插入前使用addslashes进行转义