【Web安全】注入攻击

目录

前言

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安全】注入攻击_第1张图片

如果用户输入

 

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

【Web安全】注入攻击_第2张图片

 1.4.2 代码注入

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

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

攻击者可以构造如下payload:

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

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

攻击者可以利用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中执行)

你可能感兴趣的:(Web安全,web安全,java,安全)