注入攻击之sql注入

在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.使用安全函数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值