注入类漏洞
SQL注入漏洞
定义
sql注入漏洞,就是将用户可控的数据拼接到了sql语句当中,一起提交到了数据库执行。
攻*击者通过注入语句,改变sql执行的逻辑,通过控制部分sql语句,攻击者可以查询到数据库钟任何自己需要的数据,利用数据库的一些特性们,可以直接获取数据库服务器的系统权限。
漏洞分类
- Error-based SQL injection 报错型注入
- Boolean-based blind SQL injection 布尔型注入
- Time-based blind SQL injection 基于时间延迟注入
提交的参数类型
- 数字型
- 字符型
- 搜索型
示例-报错型
以上注入,又被叫做万能密码,可以实现一些网站用户登录
实例-bool型
在靶场环境,输入http://localhost:81/sqli/Less-8/?id=1打开该平台,这时会向数据库送人一条查询:
SELECT * FROM table_name WHERE id=1
显示如下界面
当攻击者使用嵌入(')的查询,即:
http://localhost:81/sqli/Less-8/?id=1'
黄色文本消失,也没有得到任何错误信息,使用其他攻击方式的情况于此相同。
攻击者可以通过盲注来进行验证,该注入查询返回的一定是TRUE或者FALSE。
再次验证是否为布尔型注入,插入判断语句:
http://localhost:81/sqli/Less-9/id=1 AND 1=1 --+
其中 --+在数据库中代表注释的意思
对应的后端数据库查询为:
SELECT * FROM table_name WHERE id=1' AND 1=1
获取数据库名等信息
首先确定数据库中字符串长度,简单来说就是获取数据名的长度。
http://localhost:81/sqli/Less-9/id=1' AND (length(database())=1 -+
确定页面没反应,则认为返回的是FALSE,意味着当前数据库名的长度不等于1
尝试判断数据库名的长度为2
http://localhost:81/sqli/Less-9/id=1' AND (length(database())=2 --+
当尝试判断数据库名的长度为8的时候,
http://localhost:81/sqli/Less-9/id=1' AND (length(database())=8 --+
此时页面有变化,显示TRUE.可以判断出数据名为8。通过一些自动化工具,自动化遍历出该信息。
计算机无法理解人类的语言,可以通过ASCII码,将字符集中的每一个符号都对应一个整数,比如字母,数字,标点符号,特殊字符和操作符号。
可以使用ASCII码枚举出这8个字符。
下一条查询使用关键字ascii substr检查出当前数据库名中的第一个字符串对应ASCII码是否大于100
http://loaclhost:81/sqli/Less-8/?id=1' AND (ascii(substr((selectdatabase()),1,1))) > 100 --+
可以看出第一个字符串的ASCII的码确实大于100.
同理,可以尝试判断第二个字符的ASCII是多少
http://loaclhost:81/sqli/Less-8/?id=1' AND (ascii(substr((selectdatabase()),2,1))) > 101 --+
按照如上方法,可以得到全部8个字符
sql注入工具
sqlmap
自己开发脚本
sql注入安全方法措施
- 使用参数化查询
- 严格限定参数类型和格式,明确参数检验的边界,必须在服务端正式处理之前对提交的数据的合法性进行检查;
- 验证输入/参数过滤,即黑/白名单验证
XSS-跨站脚本攻击
XSS漏洞,从本质上来说就是将数据注入到了静态脚本代码中,(HTML或者javascript等),当浏览器渲染了整个HTML文档的过程中,
触发了注入的脚本,导致了XSS攻击的发生
XSS的危害
客户端
- 窃取cookie
- 转发邮件
- 放置木马
- 刷流量
服务器端
- 串改页面
- 蠕虫
- 内网扫描
XSS的分类
- Reflected XSS ,反射型,非持久
代码一般存在于连接中,请求这样的链接的时候,跨站代码经过服务端反射回来,这类跨站代码一般不存储到服务端
- Stored XSS ,存储型,持久
这时利用起来最方便的跨站类型,跨站代码存储于服务端,比如数据库中
- DOM based XSS
一种基于DOM的跨站,这是客户端脚本自身解析不正确导致的安全问题。
反射性XSS
过程如下
- 用户正常登录
- 攻击者把恶意的URL提交给用户
- 用户请求恶意攻击者的URL
- 服务器对攻击者的JS做出回应
- 攻击者的JS在客户端浏览器执行
- 用户的浏览器向攻击者发送会话令牌
- 攻击者劫持用户会话
利用页面参数调用
使用alert 弹框测试
存储型XSS
- 用户正常浏览信息
- 通过发帖向服务器发送存在恶意代码的帖子
- 用户查看发帖网页,查看帖子内容
- 服务器将恶意的代码发送给用户
- 用户端浏览器执行恶意代码
存储型XSS可能出现的位置
用户注册类,用户名,注册邮箱,手机号,个人说明,留言评论,发布文章公告
基于DOM型XSS
不可控的危险数据,未经过过滤传入存在缺陷的,javascript代码处理,最终春发DOM XSS漏洞
与前面两种XSS的区别就在于xss代码不需要服务器解析响应的直接参与,触发xss靠的是浏览器端的DOM解析。
通过前端脚本修改页面的DOM节点形成的XSS,代码可见,从前端获取到的DOM中的数据在本地执行,从效果上来说也是反射型XSS
XSS的防范措施
程序开发者:
- 对用户提交的内容进行合法性校验
- 对用户提交的内容进行转义处理
- 对用户输入的长度进行限制
- 限制Cookie到期时间
跨站脚本伪造CRSF
- 在用户会话下对某个请求发出GET/POST请求,而请求并非用户自愿发出
- 网站通过cookie识别用户,当用户在某个网站成功进行身份验证后,浏览器会得到一个标识其身份的COOKIE,只要不关闭浏览器或者退出,以后访问这个网站都会带上这个cookie
- 如果这期间被人诱骗了请求了这个网站的url,则相当于发出了身份认证请求后,可能会执行一些用户不想做的敏感操作
- 服务器接受到攻击者伪造的来自浏览器的请求并执行
缺陷代码举例
A站点
恶意站点上的代码
CSRF和XSS的区别
攻击流程
- 攻击者发现XSS漏洞--构造代码--发送给受害人--受害人打开--攻击者获取受害人的cookie--完成攻击
- 攻击者发现CSRF漏洞--狗仔代码--发送给受害人--受害人打开--受害人执行代码--完成攻击
区别
- XSS容易发现,因为攻击者需要登录后台完成攻击,管理员可以看日志发现攻击者
- CSRF不同,他的攻击一直是管理员自己实现的,攻击者只负责了构造代码
CSRF防护
- HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从那个页面链接过来的
- request.getHeader("REFERER");
- 通过检查Referer的值,可以判断请求是合法的还是非法的,那么Refere Check可以用于监控CSRF攻击的发生
文件上传漏洞
非法文件长传产生的主要原因就是在服务器端没有对用户上传的文件类型进行校验或者校验不完整,导致用户可以长传恶意脚本到服务器
文件上传绕过
代码实例
可以利用该漏洞上传webshell,病毒以及其他恶意代码能够进行进一步提权,获取数据库信息(拖库)甚至拿到服务器权限
防护
在不影响业务的前提下
- 服务器端添加上传文件类型白名单,校验功能,仅允许业务需求类型上传
- 服务器端添加上传文件名特殊字符过滤机制,防止特殊字符引起的文件解析漏洞
- 服务器端添加上传文件重命名机制,包含文件后缀格式重命名
- 服务器端添加上传文件内容识别机制,防止恶意文件伪装成图片等类型文件上传
- 服务器端到单独创建上传目录,并限制目录解析权限,杜绝目录解析网页类型文件路径遍历-任意文件下载
路径遍历漏洞原因
服务器端,接受浏览器传来的文件名称,在服务器端拼凑成文件的绝对路径,并且输出流下载
防护
方法1
- 要下载的文件地址保存到数据库中
- 文件ID使用随机数命名
- 文件路径保存到数据库,用户提交文件对应ID下载文件
- 下载文件之前做权限的判断
- 记录文件下载日志
方法2:
针对文件的访问,直接给出文件路径的链接,如:
<a href ="http://xx.xx.xx.xx//upload/file1.jgp">
失效的身份认证和会话劫持
- 用户身份验证凭证没有使用哈希或者加密保护
- 认证凭证可以猜测
- Sessionid暴露在URL
- Sessionid没有超时限制
- 密码,会话ID和其他认证凭据使用未加密传输
越权
垂直越权漏洞
也叫权限提升漏洞,由于WEB应用程序没有做权限控制或者仅仅在菜单上做了权限控制,导致的恶意用户只要猜测其他管理页面的URL,就可以访问或者控制其他角色拥有的数据或者页面,达到权限提升的目的
水平越权漏洞
WEB用用程序接收到用户请求,修改某条数据的时候,没有判断数据的所属人,或者判断数据所属人的时候,从用户提交的REQUEST参数(用户可以控制数据)中,获取了数据所属人的ID,导致恶意攻击者可以通过变换数据ID,或者更换所属人id,导致恶意攻击者可以通过变换数据ID,或者变换所属人id,修改不属于自己的数据,恶意用户可以栓除或者修改其他人的数据。
远程命令执行漏洞
strust2远程命令执行
攻击者通过构造特定数带入OGNL表达式即可能被解析并且执行,而OGNL可以用来获取和设置java对象的属性,同时也可以对服务器端对象进行修改,所以只要绕开strust2的一些安全策略,攻击者甚至可以执行系统命令进行系统攻击
在strust2中,DefaultActionMapper类支持以action,redirect:.redirectAction作为导航或者是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于strust2中没有对这些前缀进行过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
java反序列化漏洞
- 序列化 ObjectOutputStream类-->writeObject()
该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中,按照java的标准约定是给文件一个.ser扩展名
- 反序列化ObjectOutputStream类-->readObject()
该方法从一个源输入流中读取字节序列,再把他们反序列化为一个对象,并将其返回.
如果java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行.