注入攻击是web领域最为常见的攻击方式,其本质是把用户输入的数据当做代码执行,主要原因是违背了数据与代码分离原则,其发生的两个条件:用户可以控制数据输入;代码拼接了用户输入的数据,把数据当做代码执行了。

下面是几种常见注入攻击及其防御方法:

SQL注入及常见攻击技巧

经典注入  如:

$username = $_POST['username'];
$sql = "select * from usertable where username="."'".$username."'"

正常情况下用户输入 ‘Tom’ ,sql为

"select * from usertable where username='Tom'";

但如果用户输入 ”Tom' ; drop table usertable--“,sql如下:

"select * from usertable where username='Tom';drop table usertable--";

如果我们的服务端代码,数据库权限没做任何处理,那么结果伤不起。

并且当用户输入了可以导致拼接后sql有语法错的时候,如果服务器开启了错误显示,那么将会是攻击更加便利容易,因为错误信息可能会暴露我们的数据库信息或者sql语句的雏形等等。

盲注:

大多数情况下服务器是关闭错误回显的,没有提示的情况下,攻击者又总结出了盲注:sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,攻击者需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

攻击者通过真假命题的拼接根据页面返回情况判断sql漏洞是否存在。

比如:http://news.com/newsIndo.php?id=1,执行的sql为 select * from newstable where id =1;

攻击者先是http://news.com/newsIndo.php?id=1 and 1=2  然后  http://news.com/newsIndo.php?id=1 and 1=1

and 1=2 时 通常是空页面 或者错误信息,如果 and 1=1的时候页面正常返回,就说明,and语句成立,也就说明sql漏洞存在,攻击者不知道会拼接什么样的坏心思...

盲注高级技巧Timing Attack 利用数据库自身函数的的执行造成的返回变化来判断漏洞是否存在,比如 MySQL BENCHMARK()函数。

数据库攻击机巧

常见Payload

SQL注入可以猜解出数据库的对应版本,比如下面这段Payload,如果MySQL的版本是4,则会返回true。

http://www.site.com/news.php?id=5 and substring(@@version,1,1)=4

下面这段Payload,则是利用union select来分别确认表名admin是否存在,列名passwd是否存在:

id=5 union all select 1,2,3 from admin

id=5 union all select 1,2,passwd from admin

进一步,想要猜解出username和password具体的值,可以通过判断字符的范围,一步步读出来。

id=5 and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1))>64

这个过程非常的繁琐,所以非常有必要使用一个自动化工具来帮助完成整个过程。

sqlmap.py就是一个非常好的自动化注入工具。

在注入攻击的过程中,常常会用到一些读写文件的技巧。比如在MySQL中,就可以通过LOAD_FILE()读取系统文件,并通过INTO  DUMPFILE写入本地文件。当然这要求当前数据库用户有读写系统相应文件或目录的权限。

命令执行

在MySQL中,除了可以通过导出webshell间接地执行命令外,还可以利用“用户自定义函数”的技巧,即UDF(user-defined functions)来执行命令。

攻击存储过程

一些存储过程也是对攻击过程有帮助的,比如:SQL Server 中的xp_cmdshell,注入时可以利用其执行系统命令。存储过程本省也可能给存在注入漏洞。

编码问题

有时候不同的字符编码也可能导致注入漏洞的出现,比如 转义符 ‘\’ 可能会因为字符编码的不同被省略掉,保证数据库,操作系统,web应用的字符编码统一可以避免此类问题。

防御SQL注入

使用预编译语句

一般来说,防御sql注入的最佳方式就是使用预编译语句,绑定变量。使用预编译的sql语句,语句的语义不会发生改变。在sql中变量用?表示,攻击者无法改变sql的结构,比如下面PHP绑定变量,使用预编译语句的示例:

1 $sql = "insert into usertable (username,password,phone) value(?,?,?)";
2 $stmt = $mysqli->prepare($sql);
3 $stmt = bind_parm("sss",$username,$password,$phone);
4 $username = 'Tom';
5 $password = md5('123456');
6 $phone = '13510345678';
7 $stmt->execute();

此时就算攻击者插入类似于 Tom’ or ''='1的字符串,也只会将其当做username来插入,不会改变语句的执行。

检查数据类型

对输入数据的数据类型进行检查,可以很大程度上对抗sql注入,比如整形integer,亦或是邮箱,时间日期等特定格式数据。

使用安全函数

使用足够安全的编码函数,比如:ESAPI.encoder().encodeForSQL( new OracleCodec(), queryparam );

Codec ORACLE_CODEC = new OracleCodec();
String query = "SELECT user_id FROM user_data WHERE user_name = '" +
ESAPI.encoder().encodeForSQL( ORACLE_CODEC , req.getParameter("userID")) + "' and 
user_password = '" +  ESAPI.encoder().encodeForSQL( ORACLE_CODE , req.getParameter("pwd")) +"'";

最小权限及关闭错误回显

关闭服务器错误回显,避免数据库信息的暴露,数据库使用最小权限原则,避免root等高级账号在web应用中的直接使用,数据库账号不应该有创建自定义函数,操作本地文件等权限。

XML注入

$doc = new DOMDocument('1.0','utf-8');
$doc -> formatOutput = true; $user = $doc -> createElement('user');
$username = $doc -> createElement('username'); $namevalue = $doc -> createTextNode($_POST['username']); $username -> appendChild($namevalue);//将标签内容赋给标签 $user -> appendChild($username); $doc -> appendChild($user); $doc -> save("user.xml");

正常情况下用户输入 Tom将保存下面xml文件

<?xml version="1.0" encoding="utf-8"?>
<user>
<username>Tom</username>
</user>

但是如果用户输入恶意数据

Tom</username></user><user><username>Jack</username></user>

此时xml文件

<?xml version="1.0" encoding="utf-8"?>
<user>
<username>Tom</username>
</user>
<user>
<username>Jack</username>
</user>

这就是XML注入。XML注入,可以对用户输入数据中的包含”语言本身的保留字符“行进转义即可。

代码注入

代码注入与命令注入都是由一些不安全函数或方法引起的如:eval()

$var = 'varname';
$k = $_GET['tag'];
eval("/$var = $k;");

攻击者可以通过下面Payload实施代码注入:

/indexPHP?tag=1;phpinfo()

又比如 system()这个函数,可以通过代码注入导致命令注入

$error =system('cat '.$_GET['page_id'],$return_var);
echo $error;

攻击者通过 index.php?page_id=loquesea;ls利用system函数执行自己想要的系统命令。

防御对抗代码注入,命令注入,需要禁用一些像eval(),system()等可以执行系统命令的函数,非要用到就需要对用户输入的数据做处理,此外PHP中动态include远程文件,也是能避免就避免。

CRLF(\r\n)注入

CRLF其实是两个字符\n\r,常常被用作语义之间的分隔符,因此CRLF注入很可能改变原有的语义,如下

$log = fopen("login.log", "w");
$txt = "user login failed for: \n";
fwrite($log, $txt);
fclose($log);

正常情况会记录如下在login.log日志文件中,

user login failed for :user1
user login failed for :user2

但是因为没有对换行 \n做处理,当攻击者输入 user2\nuser2 login succeeded for :user2

日志中结果就会变为

user login failed for :user1
user login failed for :user2
user login succeeded for :user2

多了一条伪记录,user2并没有登录成功。

CRLF注入不仅仅可以log注入,凡是利用CRLF作为分隔符的地方都可能存在这样的注入,像是”注入HTTP头“等。

对抗CRLF注入其实只需要处理好 \r \n这两个保留字符即可。

写在最后:注入攻击主要是违背了数据与代码分离原则导致的,其先决条件是用户能控制数据输入,并且代码拼接了用户输入的数据,把数据也打个代码执行了。所以,防御遵从数据域代码分离原则,在拼接的地方做好安全检查和处理就能避免此类问题了。

WEB服务端安全---注入攻击的更多相关文章

  1. SSTI服务端模板注入漏洞原理详解及利用姿势集锦

    目录 基本概念 模板引擎 SSTI Jinja2 Python基础 漏洞原理 代码复现 Payload解析 常规绕过姿势 其他Payload 过滤关键字 过滤中括号 过滤下划线 过滤点.(适用于Fla ...

  2. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  3. winform客户端利用webClient实现与Web服务端的数据传输

    由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...

  4. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  5. Web服务端性能提升实践

    随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...

  6. 服务端模版注入漏洞检测payload整理

    服务端模版注入漏洞产生的根源是将用户输入的数据被模版引擎解析渲染可能导致代码执行漏洞 下表涵盖了java,php,python,javascript语言中可能使用到的模版引擎,如果网站存在服务端模版注 ...

  7. Delphi XE5通过WebService开发Web服务端和手机客户端

    Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices  stand-alone vcl applicati ...

  8. wsgiref手写一个web服务端

    ''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...

  9. web服务端的架构演变

    此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近Lofter项目碰到很多性能上的问题,特别是数据库相关的,每次推送后,告警就会第一时间到来.这些问题随着产 ...

随机推荐

  1. [Linux] 013 其他文件搜索命令

    1. 文件搜索命令:locate 命令名称:locate 命令所在路径:/bin/locate 执行权限:所有用户 语法:locate 文件名 功能描述:在文件资料库中查找文件 范例: $ locat ...

  2. c#批量插入

    一.创建一个用来测试的数据库和表 USE [Test] GO /****** Object: Table [dbo].[student] Script Date: 2019/4/11 15:38:59 ...

  3. tomcat内存使用情况

    预发布阿里云服务器的容器 tomcat会自己无缘无故重启,故引出一些查看tomcat内存使用情况观察的细枝末节: 1️⃣当前端口号进程信息和GC使用情况(1)显示端口的PID:lsof -i:端口示例 ...

  4. 我心中的ASP.NET Core 新核心对象WebHost(一)

    以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...

  5. css样式表的引入方式

    一般来说,css 有两种样式表的引入方式,在这里我记录一下,比较这两种引入方式的区别: <link rel="stylesheet" type="text/css& ...

  6. 常见前端面试题http部分

    1.常见http状态码 100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 200 OK 正常返回信息 20 ...

  7. @Profile使用及SpringBoot获取profile值

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Fmuma/article/details ...

  8. 挖坑指南:iView-admin动态配置route.meta.title

    原文链接 前言 新的项目,基于iView-admin.结合自身的项目需求,对官方的模板进行一些修改.以达到动态修改route.meta,并同步更新面包屑导航文字和标签页标题. 开始 如果你还未使用过i ...

  9. Sass函数:Opacity函数-opacify()、fade-in()函数

    这两个函数是用来对已有颜色的透明度做一个加法运算,会让颜色更加不透明.其接受两个参数,第一个参数是原始颜色,第二个参数是你需要增加的透明度值,其取值范围主要是在 0~1 之间.当透明度值增加到大于 1 ...

  10. git,提交错了分支,想把远程的分支恢复到上一个版本

    1.先将本地分支回滚到上一个版本 2.删除远程分支(可以先备份一下) 3.创建新的分支,将本地分支push上去