【网络安全】SQL注入、XML注入、JSON注入和CRLF注入科普文

SQL注入

所谓SQL注入,是将恶意SQL命令经过某种方式提交到服务器后台,并欺骗服务器执行这些恶意的SQL命令的一种攻击方式。 —— [ 百度百科 ]
形成SQL注入漏洞缘由有两个:一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。html

一些寻找SQL漏洞的方法

http://host/test.php?id=100 and 1=1        //返回成功
http://host/test.php?id=100 and 1=2        //返回失败
http://host/test.php?name=rainman ‘ and ‘1’=‘1        //返回成功 
http://host/test.php?name=rainman ‘ and ‘1’=‘2        //返回失败
http://host/test.php?name=rainman ‘ and ‘1’=‘2 ))     //使用括号进行语句闭合

//在具备模糊搜索的地方
1)先搜索('),若是出错,说明90%存在这个漏洞。
2)而后搜索(%),若是正常返回,说明95%有洞了。 
3)而后再搜索一个关键字,好比(2006)吧,正常返回全部2006相关的信息。
4)再搜索(2006%'and 1=1 and '%'=')和(2006%'and 1=2 and '%'=')。

//看看可否绕过验证
(1) 用户名输入: ‘or 1=1 or’  密码:任意
(2) Admin’ -- (或’or 1=1 or’ --)(admin or 1=1 --) (MSSQL)(直接输入用户名,不进行密码验证)
(3) 用户名输入:admin   密码输入:’ or ‘1’=‘1  也能够
(4) 用户名输入:admin' or 'a'='a    密码输入:任意
(5) 用户名输入:’ or 1=1 --
(6) 用户名输入:admin’ or 1=1 --  密码输入:任意
(7) 用户名输入:1'or'1'='1'or'1'='1   密码输入:任意

//不一样的SQL服务器连结字符串的语法不一样,好比MS SQL Server使用符号+来连结字符串,而Oracle使用符号||来连结
http://host/test.jsp?ProdName=Book’       //返回错误
http://host/test.jsp?ProdName=B’+’ook     //返回正常
http://host/test.jsp?ProdName=B’||’ook    //返回正常说明有SQL注入
若是应用程序已通过滤了’和+等特殊字符,咱们仍然能够在输入时过把字符转换成URL编码(即字符ASCII码的16进制)来绕过检查。

防护SQL注入

  • 对输入进行过滤;
  • 使用预编译的SQL语句,好比Java中的PreparedStatement;
  • 使用存储过程(不是全部场景都使用,这个方法不是很推荐);
  • MyBatis的SQL注入防御—模糊查询
-- MySQL
select * from table where name like concat('%',#{name},'%')
-- Oracle
select * from table where name like '%' || #{name} || '%'
-- SQL Server
select * from table where name like '%'+#{name}+'%'
-- DB2
select * from table where name like concat('%',#{name},'%')

SQL注入相关的优秀博客

XML注入

什么是XML注入

XML的设计宗旨是传输数据,而非显示数据。XML注入是一种古老的技术,经过利用闭合标签改写XML文件实现的。sql

下面举个最简单的例子数据库

<?xml version="1.0" encoding="utf-8"?>
<USER>
  <user Account="admin">用户输入</user>
  <user Account="root">root</user>
</USER>

若攻击者恰好能掌控用户输入字段,输入 admin hacker ,最终修改结果为: json

<?xml version="1.0" encoding="utf-8" ?>
<USER>
  <user Account="admin">admin</user>
  <user Account="hacker">hacker</user>
  <user Account="root">root</user>
</USER>

这样咱们能够经过XML注入添加一个管理员帐户。浏览器

预防XML注入

  • 对有改变XML结构的特殊输入进行过滤或者编码;
  • 对["&","<",">","'".'"',"/"]这些特殊字符过滤。

JSON注入

什么是JSON注入

咱们知道JSON是根据引号(")、冒号(:)、逗号(,)和花括号({})区分各字符的意义的。若是有恶意用户向JSON中注入恶意字符,那么JSON将解析失败。例如,输入的PassWord值为:admin"888
那么组装成的JSON数据位以下:服务器

"PassWord":" admin"888"

在PassWord中的引号将会破坏整个JSON的结构,致使JSON解析失败。JSON注入没有其余几种注入的危害性大,但依然不可小视,笔者一直认为没有低危的漏洞,只是还没碰到可利用的场景,攻击者可能经过这类低危漏洞辅助其余攻击,这时低危漏洞将再也不低危。jsp

JSON注入的防护

如何防护JSON注射呢?方法依然很简单,只须要对其关键字符进行转义便可,如:将"admin"888"转换为"admin"888",这样JSON的值就能够解析了。若是字符串中出现"",一样须要将其转义"\"。编码

CRLF注入

咱们知道:一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。请求报文格式就以下图所示:操作系统

参考博客

咱们能够发现请求行和请求头的尾部都有CRLF标志,请求头和请求体之间也是经过CRLF标志分割的。CRLF注入漏洞就是利用Http的这种报文结构,向请求行或请求头的字段注入恶意的CRLF,就能注入一些首部字段或报文主体(请求响应数据),并在响应中输出,因此CRLF又称为HTTP响应拆分漏洞(HTTP Response Splitting)。

CRLF介绍

CRLF指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n,%0a)。CRLF的概念最先源自打字机,代表行的结束,计算机出现后沿用了这个概念。

回车符(\r)的做用是将光标移到行首,换行符(\n)的做用是将光标垂直移到下行。键盘上的回车键(Enter)就能够执行该操做。可是不一样的操做系统,行的结束符是不同的。Windows系统使用CRLF表示行的结束,Linux/Unix系统使用LF表示行的结束,MacOS系统早期使用CR表示,可是如今好像也用LF表示行的结束。因此同一文件在不一样操做系统中打开,内容格式可能会出现差别,这是行结束符不一致致使的。

在HTTP规范中,行使用CRLF来结束。首部与主体由两个CRLF分隔,浏览器根据这两个CRLF来获取HTTP内容并显示。

CRLF漏洞检测

CRLF注入漏洞的本质和XSS有点类似,攻击者将恶意数据发送给易受攻击的Web应用程序,Web应用程序将恶意数据输出在HTTP响应头中(XSS通常输出在主体中)。因此CRLF注入漏洞的检测也和XSS漏洞的检测差很少。经过修改HTTP参数或URL,注入恶意的CRLF,查看构造的恶意数据是否在响应头中输出。

总结下:
若是你找到了一个你传给Web程序的参数最后会在响应的Http头部回显,那么这个地方可能就是一个存在CRLF注入漏洞的地方。

CRLF漏洞预防

  • 过滤参数中的\r\n之类的行结束符;
  • 输入参数尽可能不要在相应头部回显,若是非要回显的话必定要对该字段的输入值进行严格的过滤。
相关文章
相关标签/搜索