在1998年,一位名为rfp的黑客发表了一篇题为“NT Web Technology Vulnerabilities”的文章
注入攻击的两个条件:
(1).用户能够克制数据的输入--在这里,用户能够控制变量;
(2).原本要执行的代码,凭借了用户的输入;
一般输入一个‘单引号就能引起执行查询语句的语法错误,有些服务器会直接返回错误回显,有些服务器则不返回任何东西。
盲注(Blind Injection)
在Web服务器关闭了错误回显的时候,我们就可以采用盲注的技巧
所谓盲注,就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必须找到一个方法来验证注入的SQL语句是否得到执行。
最常见的就是构造简单的条件语句,根据返回页面是否法神变化,来判断sql语句是否得到执行
例 ?id=2 and 1=2,因为1=2是个假命题,所以永远无法成立。?id=1 and 1=1,如果它能正确的返回时,就说明了sql语句的“and" 成功执行,所以就存在注入的漏洞。
Timing Attacks
在mysql中有一个BENCHMARK()函数用于测试函数性能的。利用这个BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。
payload:
1170 UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM (Select Database() as current) as tbl;
这段payload用于判断库名的第一个字母是否是CHAR(119),即小写的w。
mysql->BENCHMARK(10000000,md5(1)) or SLEEP(5)
PorstgreSQL->PG_SLEEP(5) or GENERATE_SERIES(1,1000000)
MS SQL Server->WAITFOR DELAY '0:0:5'
数据库攻击方式
虽然有各种各样的payload,但是有一些非常麻烦,记起来也不怎么容易。
所以上sqlmap跑就好了。
命令执行
除了可以通过到处webshell间接的执行命令外,还可以利用”用户自定义函数“的技巧,即UDF(user-Defined Functions)来执行命令
另外的方法,通过lib_mysqludf_sys提供的几个函数执行系统命令,其中最主要的函数是sys_eval()和sys_exec()。
编码问题
当使用GBK编码时,0xbf27和0xbf5c都会被认为是一个字符(双字节字符)
在进入数据哭之前,在web语言中则没有考虑到双字节字符的问题,双字节字符会被认为是两个字节,比如php中的addslashes()函数,或者当magic_quotes_gpc开启时,会在特殊的字符前增加一个转义字符"\"。
如何防御sql注入攻击
1.使用预编译的语句
使用预编译的语句,sql语句的语义不会发生改变,变量用?表示,攻击者无法改变sql的结构
2.使用存储过程
使用安全的存储过程对抗sql注入。
3.检查数据类型
4.使用安全函数
注入攻击的两个条件:
(1).用户能够克制数据的输入--在这里,用户能够控制变量;
(2).原本要执行的代码,凭借了用户的输入;
一般输入一个‘单引号就能引起执行查询语句的语法错误,有些服务器会直接返回错误回显,有些服务器则不返回任何东西。
盲注(Blind Injection)
在Web服务器关闭了错误回显的时候,我们就可以采用盲注的技巧
所谓盲注,就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必须找到一个方法来验证注入的SQL语句是否得到执行。
最常见的就是构造简单的条件语句,根据返回页面是否法神变化,来判断sql语句是否得到执行
例 ?id=2 and 1=2,因为1=2是个假命题,所以永远无法成立。?id=1 and 1=1,如果它能正确的返回时,就说明了sql语句的“and" 成功执行,所以就存在注入的漏洞。
Timing Attacks
在mysql中有一个BENCHMARK()函数用于测试函数性能的。利用这个BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。
payload:
1170 UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM (Select Database() as current) as tbl;
这段payload用于判断库名的第一个字母是否是CHAR(119),即小写的w。
mysql->BENCHMARK(10000000,md5(1)) or SLEEP(5)
PorstgreSQL->PG_SLEEP(5) or GENERATE_SERIES(1,1000000)
MS SQL Server->WAITFOR DELAY '0:0:5'
数据库攻击方式
虽然有各种各样的payload,但是有一些非常麻烦,记起来也不怎么容易。
所以上sqlmap跑就好了。
命令执行
除了可以通过到处webshell间接的执行命令外,还可以利用”用户自定义函数“的技巧,即UDF(user-Defined Functions)来执行命令
另外的方法,通过lib_mysqludf_sys提供的几个函数执行系统命令,其中最主要的函数是sys_eval()和sys_exec()。
编码问题
当使用GBK编码时,0xbf27和0xbf5c都会被认为是一个字符(双字节字符)
在进入数据哭之前,在web语言中则没有考虑到双字节字符的问题,双字节字符会被认为是两个字节,比如php中的addslashes()函数,或者当magic_quotes_gpc开启时,会在特殊的字符前增加一个转义字符"\"。
如何防御sql注入攻击
1.使用预编译的语句
使用预编译的语句,sql语句的语义不会发生改变,变量用?表示,攻击者无法改变sql的结构
2.使用存储过程
使用安全的存储过程对抗sql注入。
3.检查数据类型
4.使用安全函数