【Web安全】注入攻击

时间:2022-12-13 15:54:24

目录

前言

1、注入攻击

1.1 SQL注入

1.2  数据库攻击技巧

1.2.1 常见的攻击技巧

1.2.2 命令执行

1.2.3 攻击存储过程

1.2.4 编码问题

1.2.5 SQL Column Truncation

1.3 正确防御SQL注入

1.4 其他注入攻击

1.4.1 XML注入

 1.4.2 代码注入

1.4.3 CRLF注入


前言

年底了……期末了……实验一堆一堆的来,我的csdn-flag不得不倒了,所以近期没有之前更新的勤了,为我失去的3个粉感到抱歉哈哈哈QWQ。希望在熬过这个学期期末之后,能够重返之前的学习热情,保持良好的学习习惯,明年咱们搞事业!!!

1、注入攻击

注入攻击的本质,是把用户输入的数据当成代码执行。这里有两个关键条件:

  • 用户能够控制输入
  • 原本程序要执行的代码,拼接了用户输入的数据

1.1 SQL注入

SQL注入应该都耳熟能详了,可以分为根据报错注入、堆叠注入、二次注入、宽字节注入和盲注(布尔盲注、时间盲注、dnslog注入)……这里就不再进行详细讲解。

【每天学习一点新知识】跟咩咩一起学“宽字节注入”_RexHarrr的博客-CSDN博客
DVWA之SQL注入_RexHarrr的博客-CSDN博客

DVWA 之 SQL Injection Blind(SQL盲注)_RexHarrr的博客-CSDN博客

1.2  数据库攻击技巧

SQL注入是基于数据库的一种攻击。不同数据库有着不同的功能、不同的语法和函数,因此针对不同的数据库,SQL注入的技巧也不同。

1.2.1 常见的攻击技巧

SQL注入可以猜解数据库的对应版本,如下面这个payload,如果mysql的版本是4,则会返回True

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

可以利用union select来确认表名admin、列名passwd是否存在

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

同理可猜解出具体值,但比较繁琐。sqlmap就是个很好的自动化工具。

【每天学习一点新知识】sqlmap的使用_RexHarrr的博客-CSDN博客_sqlmap 刷新session

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

当然除了INTO DUMPFILE之外,也可以使用INTO OUTFILE,前者适用于二进制文件,它会将目标文件写入同一行内,后者更适用于文本文件。

写入文件的技巧,经常被用于导出一个webshell,为攻击者的进一步攻击做铺垫,因此在设计数据库安全方案时,可以禁止普通数据库用户具备操作文件的权限。

1.2.2 命令执行

在MySQL中,除了可以通过导出webshell间接执行命令外,还可以利用用户自定义函数,即UDF来执行命令。

在流行的数据库中,一般都支持从本地文件系统中导入一个共享库文件作为自定义函数。使用如下语法可以创建UDF

CREATE FUNCTION f_name RETURNS INTEGER SONAME shared_library

在创建UDF之后,可以使用sys_eval()等函数执行系统命令

  • sys_eval:执行任意命令,并将输出返回
  • sys_exec:执行任意命令,并将退出码返回
  • sys_get:获取一个环境变量
  • sys_set:创建或修改一个环境变量

一般来说,在数据库中执行系统命令,要求具有较高权限。在建立数据库账户时应该遵循“最小权限原则”,尽量避免给Web应用使用数据库的管理员权限。

1.2.3 攻击存储过程

存储过程为数据库提供了强大的功能 ,它和UDF很像,但存储过程必须使用CALL或EXECUTE来执行。

例如在SQL server中

EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'
EXEC master.dbo.xp_cmdshell 'ping '

除了xp_cmdshell之外,还有一些其他的存储过程对攻击过程很有帮助。

可以操作注册表的存储过程有:

  • xp_regaddmultistring
  • xp_regdeletekey
  • xp_regdeletevalue
  • xp_regenumkeys
  • xp_regenumvalues
  • xp_regread
  • xp_regremovemultistring
  • xp_regwrite

此外,以下存储过程对攻击者也很有用

xp_availablemedia:显示机器上有用的驱动器

xp_servicecontrol:允许用户启动、停止服务

xp_dirtree:允许获得一个目录树

xp_enumdsn:列举服务器上的ODBC数据源

xp_loginconfig:获取服务器安全信息

xp_makecab:允许用户在服务器上创建一个压缩文件

……

除了利用存储过程直接攻击外,存储过程本身 也可能会存在注入漏洞。若外部传入的变量未经过任何处理,将直接造成SQL注入问题。

1.2.4 编码问题

典型就是宽字节注入

 【每天学习一点新知识】跟咩咩一起学“宽字节注入”_RexHarrr的博客-CSDN博客

1.2.5 SQL Column Truncation

在MySQL的配置选项中,有一个sql_mode选项。当设置为default时,即没有开启STRICT_ALL_TABLES选项时,MySQL对于用户插入的超长值只会提示warning,而不是error,这可能会导致发生一些截断问题。

1.3 正确防御SQL注入

  • 使用预编译语句,绑定变量
  • 使用安全的存储过程来对抗SQL注入
  • 检查输入数据的数据类型
  • 使用安全函数

1.4 其他注入攻击

1.4.1 XML注入

XML是一种常用的标记语言,通过标签对数据进行结构化表示。其注入方法和HTML注入类似。

如下段代码会产生一个XML文件

【Web安全】注入攻击

如果用户输入

【Web安全】注入攻击 

则最终生成的XML文件里会被插入一条数据

【Web安全】注入攻击

 1.4.2 代码注入

 由于不安全函数或方法引起的,典型代表为eval(),如:

$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");

攻击者可以构造如下payload:

/index.php?arg=1;phpinfo()

有时候代码注入可以造成命令注入,如

<?php
$varerror = system('cat '.$_GET['pageid'],$valoretorno);
echo $varerror;
?>

攻击者可以利用system()函数执行他想要的系统命令

vulnerable.php?pageid=loquesea;ls

对抗代码注入、命令注入,需要禁用eval()、system()等可以执行命令的函数,如果一定要用,则需要对用户的输入进行处理。此外,在PHP/JSP中避免使用动态include远程文件,或者是安全地处理它。

1.4.3 CRLF注入

CRLF实际上是两个字符:CR是Carriage Return(ASCII 13,\r),LF是Line Feed(ASCII 10,\n)。\r\n这两个字符用于换行,其十六进制分别为0x0d、0x0a.

CRLF常被用于不用语义直接的分隔符,所以通过注入CRLF字符很可能改变原有语义。

CRLF不仅能用于log注入(日志信息),凡是用CRLF作为分隔符的地方都可能存在这种注入,如注入HTTP头。在HTTP中,HTTP头是用\r\n来分隔的,如果服务器没有过滤\r\n,又把用户输入的数据放在HTTP头中,则很可能导致安全隐患。这种在HTTP头中的CRLF注入,又称“Http Response Splitting”(两次\r\n意味着HTTP头的结束,内容会被插入到HTTP Body中执行)