当前位置: 首页 > SQL, WEB安全 > 正文

SQL注入之入门篇

一、理解SQL注入

SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL数据库加以解析执行。简而言之,就是把用户输入的数据当做代码执行。注入的两个条件是:

第一,用户能够控制输入;

第二,程序要执行的代码拼接了用户输入的数据。

下面是一个SQL注入的典型例子:

变量$user的值由用户提交,在正常情况下,一般会输入用户名,比如“admin”,后台数据库会查询并返回用户“admin”的所有字段信息。但是如果用户输入一段有语义的SQL语句,比如输入$user的值为:

那么,SQL语句在实际上执行时就会如下:

可以看到原本正常执行select语句后还会执行drop语句,删除掉users表!可见这就会产生一个严重的后果。

二、盲注(Blind Injection)

盲注,就是指在服务器没有错误回显时实施的注入攻击。当没有回显信息时,就看不到服务器端的调试信息,无法判断构造的SQL语句是否能够执行。所以这不利于攻击者根据回显的信息实施更准确的攻击。盲注的验证方法是构造一个简单的条件语句,根据返回页面是否发生变化来判断SQL语句是否得到执行。

比如下面一个简单的URL:

大多数后台逻辑执行的SQL语句如下:

如果攻击者构造如下的URL并提交:

那么,SQL语句在实际上执行时就会如下:

因为“and 1=2”永远是一个假命题,所以这条SQL语句的“and”条件永远无法成立。对于Web应用来说,也不会将结果返回给用户,攻击者将看到一个空白的页面或者一个出错的页面。

继续验证注入是否真的存在,因为一些后台的逻辑或者一些安全功能会导致攻击这构造是异常请求处理异常。这次构造一个恒为真的语句,将URL的输入改为“admin’ and 1=1’”,对应SQL语句为:

如果页面返回正常了,就说明SQL语句成功执行,那么就可以判断此处的”id”参数存在SQL注入漏洞了。

三、时间延时注入(Timing Attack)

基于时间延时注入的特点就是可以根据时间的长短判断SQL语句是否得到执行。

比如,在MySQL中,有个BENCHMARK()函数,它是用于测试函数性能的,测试执行N次指定表达式所用的时间。而对于攻击者,可以利用BENCHMARK()函数让同一个函数执行多次,使得结果返回的时间比正常情况下要长,故可以根据注入语句返回时间的相对长短判断构造的语句是否执行。

利用这种基于时间等待的延时注入需要一个等待的过程,攻击这可以构造如下这种参数uid的值:

这段Payload判断库名的第一个字母是否为char(115),即小写字母s。如果判断结果为真,那么BENCHMARK()函数就会执行,使得返回的时间相对较长;反之,该语句将会很快执行完。通过这种方法,攻击就可以遍历出所有字母,直到猜测出数据库中所有的库名、表名。当然,这个过程使用自动化工具或者编写脚本将会很快在搞定。

下面是其他一些数据库中类似的函数:

MySQL:BENCHMARK(100000000,md5(1)) 、SLEEP(10)

Oracle:DBMS_LOCK.SLEEP(10)

MS SQL Server:WAITFOR_DELAY ‘0:0:10’

PostgreSQL:PG_SLEEP(10)、GENERATE_SERIES(1,10000000)



这篇博文由 s0nnet 于2015年04月12日发表在 SQL, WEB安全 分类下, 通告目前不可用,你可以至底部留下评论。
如无特别说明,独木の白帆发表的文章均为原创,欢迎大家转载,转载请注明: SQL注入之入门篇 | 独木の白帆
关键字: ,
【上一篇】【下一篇】

SQL注入之入门篇:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter