前言
年底了……期末了……实验一堆一堆的来,我的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文件
如果用户输入
则最终生成的XML文件里会被插入一条数据
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中执行)
版权归原作者 RexHarrr 所有, 如有侵权,请联系我们删除。