百恒网络
常规SQL注入检测
  • 百恒服务
  • APP开发
  • 网页案例
  • 网页知识
  • 关于我们
  • 联系我们
  • 常规SQL注入检测

    2017-05-04 17:43:55 3647
           在南昌网站建设中,SQL注入攻击可以根据bug的不同分为不同类别。通常来说,可以按照HTTP响应返回的数据种类来区分注入。如果返回的是类似下面这样的SQL错误,就可以实施基于错误的SQLi:
           You have an error in your SQL syntax; check the
           manual that corresponds to your MySQL server version
           for the right syntax to use near ''' at line 1
           某些情况下,即使SQL语句中包含错误,Web应用也根本不会返回错误。这种类型的SQLi通常叫作Blind SQLi,因为从数据库或应用得不到任何错误。
    此时,通过对比正常请求和恶意请求的HTTP响应之间的区别,也可以检测到SQLi是否会影响某些资源。前述区别可以分为两种。一种是内容长度不同,也就是返回的响应体的内容不同。另一种是响应时间不同,比如常规响应时间是1秒,而恶意响应却需要5秒。下面来看一段Ruby代码,这段代码是可以被SQL注入的:
           get "/" do
           @config = ConfigReader.instance.config
           # 从GET请求中取得book_id参数
           book_id = params[:book_id]
           # MySQL连接池
           pool = Mysql2::Client.new(
           :host => @config['db_host'],
           :username => @config['restricted_db_user'],
           :password => @config['restricted_db_userpasswd'],
           :database => @config['db_name']
           )
           begin
           if book_id == nil
           @rs = pool.query "SELECT * FROM books;"
           else
           # 若找到一个特定的book_id参数
           # 就执行以下未加密查询
           query = "SELECT * FROM books WHERE id=" + book_id + ";"
           @rs = pool.query query
           end
           erb :"sqlinjection"
           rescue Exception => e
           @rs = {}
           @error_message = e.message
           erb :"sqlinjection"
           end
           end
           如果将一个类似/page?book_id=1'的GET请求发送给这段代码中的处理程序,那么数据库就会返回类似前面的错误信息。只要发送像下面这样检索MySQL数据库版本的查询,就可以利用这种基于错误的SQLi:
           /page?book_id=1+UNION+ALL+SELECT+NULL%2C%40%40VERSION%2CNULL%23
           最终的SQL语句会被攻击者在SELECT * FROM books WHERE id=1后面追加上UNION ALL SELECT NULL, @@VERSION, NULL。Web应用的那个拼接的查询(query = "SELECT * FROM books WHERE id=" + book_id + ";")之所以不安全,是因为参数值book_id未经输入验证就被用于字符串拼接。这种[没有预处理语句(Prepared Statements)18]的查询结果,会使应用面临SQL注入的风险。
           再考虑一种情况。假设前面存在漏洞的代码除了把底部的一行(@error_message =e.message)删除之外,其余都相同,那么此时仍然可以被SQL注入攻击,只不过变成了Blind。
           假设你事先并不知道这一点,而想要检测某个资源是否可以实施SQLi。可以发送下面这个GET请求:
           /page?book_id=1+AND+SLEEP(5)
           然后,经过大约5秒钟,你才会收到HTTP响应。这么长的响应时间意味着该资源存在SQL注入漏洞,因为SLEEP语句被成功执行了。
           以上只是比较浅显的SQL注入检测。如果你觉得这些内容不好理解,随时可以来电咨询百恒网络,本公司专业从事南昌网站建设、微信开发、手机APP开发等服务,经验丰富,实力强,南昌做网站,就选百恒网络!
    展开分享
    服务
    案例
    首页
    动态
    联系
    咨询