寻找SQL注入点

如果要对一个网站进行SQL注入攻击,首先就需要找到存在SQL注入漏洞的地方,也就是寻找所谓的注入点。可能的SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方。

  最常用的寻找SQL注入点的方法,是在网站中寻找如下形式的页面链接:http://www.xxx.com/xxx.asp?id=YY

  其中“YY”可能是数字,也有可能是字符串,分别被称为整数类型数据或者字符型数据。在本章中我们主要针对整数型数据进行SQL注入讲解。

  通常可以使用以下两种方法进行检测,判断该页面链接是否存在SQL注入漏洞。

步骤/方法

  1. 1

    .“加引号”法

      在浏览器地址栏中的页面链接地址后面增加一个单引号,如下所示:

      http://www.xxx.com/xxx.asp?id=YY’

      然后访问该链接地址,浏览器可能会返回类似于下面的错误提示信息:

      Microsoft JET Database Engine 错误’80040e14’

      字符串的语法错误在查询表达式’ID=YY’中。

      /xxx.asp 行8

      如图1.3所示,页面中如果返回了类似的错误信息,说明该网站可能存在SQL注入攻击的漏洞。

    寻找SQL注入点
  2. 2

    .“1=1和1=2”法

      “加引号”法很直接,也很简单,但是对SQL注入有一定了解的程序员在编写程序时,都会将单引号过滤掉。如果再使用单引号测试,就无法检测到注入点了。这时,就可以使用经典的“1=1和1=2”法进行检测。

      如果正常页面链接地址为:http://www.xxx.com/xxx.asp?id=YY,在浏览器中分别输入以下两个链接地址,分别查看它们返回的结果值。

      Ø http://www.xxx.com/xxx.asp?id=YY and 1=1。

      Ø http://www.xxx.com/xxx.asp?id=YY and 1=2。

      如果存在注入点的话,浏览器将会分别显示为:

      Ø 正常显示,内容与正常页面显示的结果基本相同。

      Ø 提示BOF或EOF(程序没做任何判断时),或提示找不到记录,或显示内容为空(程序加了on error resume next),如图1.4所示。

      如果没有注入点的存在,也很容易判断。

      上述两种链接一般都会有程序定义的错误提示,或提示类型转换时出错。

    寻找SQL注入点
    END

注意事项

  • 可能的SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方

登陆事例SQL注入:

因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:

  
  1. select * from users where username='marcofly' and password=md5('test'

很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

比如:在用户名输入框中输入:'or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

  
  1. select * from users where username='' or 1=1#' and password=md5('') 

语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

  
  1. select * from users where username='' or 1=1#' and password=md5('') 

等价于

  
  1. select * from users where username='' or 1=1 

因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

  
  1. select * from users 

没错,该sql语句的作用是检索users表中的所有字段

小技巧:如果不知道 'or 1=1#中的单引号的作用,可以自己echo 下sql语句,就一目了然了。

 

### SQL注入的概念 SQL注入是一种严重的安全漏洞,攻击者通过此技术可以在未经授权的情况下访问、修改或删除数据库中的数据[^1]。这种攻击通常发生在Web应用程序中,当程序未能正确验证用户的输入并将其直接嵌入到SQL查询语句中时。 ### SQL注入的攻击方式 SQL注入的核心在于利用未经过滤的用户输入,在SQL查询中插入恶意代码。例如,如果一个登录表单将用户名和密码直接拼接到SQL字符串中而没有任何过滤机制,则攻击者可以通过提交特殊字符(如`' OR '1'='1`)来绕过身份验证逻辑。 以下是典型的SQL注入示例: ```sql SELECT * FROM users WHERE username = '$username' AND password = '$password'; ``` 假设 `$username` 和 `$password` 是来自用户输入的数据,那么攻击者可以提供以下输入: - 用户名:`admin' -- ` - 密码:任意值 最终生成的SQL语句变为: ```sql SELECT * FROM users WHERE username = 'admin' -- ' AND password = ''; ``` 由于 `--` 表示SQL注释符,后续部分被忽略,这可能导致非法用户成功登录系统。 ### SQL注入的防御措施 为了防止SQL注入的发生,开发人员应采用多种策略和技术手段加以防护。其中最有效的方式之一是使用预编译语句(Prepared Statements),也称为参数化查询。这种方法能够确保用户输入不会改变原始SQL语句结构,从而避免潜在风险[^2]。 #### 使用预编译语句的例子 (Python) ```python import sqlite3 connection = sqlite3.connect('example.db') cursor = connection.cursor() # 安全的做法:使用占位符 ? 来代替直接插入选项 query = "INSERT INTO employees VALUES (?, ?, ?)" data = ('John Doe', 30, 'Software Engineer') try: cursor.execute(query, data) except Exception as e: print(f"An error occurred: {e}") finally: connection.commit() connection.close() ``` 此外,针对特定编程环境下的应用也有专门推荐的技术方案。比如在PHP环境中运行的应用程序可结合MySQLi扩展或者PDO库实现更高级别的安全性控制[^3]。 ### 总结 综上所述,理解SQL注入的工作原理及其可能带来的危害至关重要;同时也要掌握如何有效地抵御此类威胁的方法论——尤其是推广使用预处理语句作为首要防线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值