sql盲注之报错注入(附自动化脚本)
时间: 2023-06-27 12:04:03 浏览: 184
SQL注入是一种常见的网络攻击方式,通过在输入框中注入SQL语句,攻击者可以获取数据库中的敏感信息,包括用户名、密码等。报错注入是一种SQL注入的方式,它利用了数据库返回错误信息的特性,通过构造特定的SQL语句来达到获取信息的目的。
以下是一个简单的报错注入示例:
假设有一个登录页面,用户需要输入用户名和密码才能登录。页面的代码如下:
```
<?php
$conn = mysqli_connect("localhost", "root", "", "mydb");
if (isset($_POST['submit'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo "登录成功";
} else {
echo "用户名或密码错误";
}
}
?>
<form method="POST">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" name="submit" value="登录">
</form>
```
攻击者可以通过在输入框中注入SQL语句来获取数据库中的信息。例如,输入`' OR 1=1--`作为用户名,`' OR 1=1--`作为密码,即可绕过登录验证,因为`OR 1=1`会使整个SQL语句始终成立,从而返回所有用户的信息。
如果服务器没有开启报错信息,攻击者还可以通过构造特定的SQL语句,使服务器返回错误信息,从而获取数据库中的信息。例如,输入`' UNION SELECT 1,2,3--`作为用户名,任意密码,即可触发错误信息,因为`UNION SELECT`语句要求两个SELECT语句的列数必须相同,而这里只有一个SELECT语句,因此会导致错误。
以下是一个自动化脚本示例,用于检测一个网站是否存在报错注入漏洞:
```
import requests
# 构造SQL语句,检测是否存在报错注入漏洞
def test_sqli(url, payload):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Cookie": "PHPSESSID=1234567890"
}
data = {
"username": payload,
"password": "123456"
}
try:
r = requests.post(url, headers=headers, data=data, timeout=5)
if "Warning" in r.text:
print("[+] 存在报错注入漏洞:" + payload)
except:
pass
# 读取字典文件,逐个测试
def main():
url = "http://example.com/index.php"
with open("dict.txt", "r") as f:
for line in f:
payload = line.strip()
test_sqli(url, payload)
if __name__ == '__main__':
main()
```
该脚本会读取一个字典文件,逐个测试其中的payload,如果存在报错注入漏洞,则会输出相应的payload。需要注意的是,该脚本只能检测是否存在报错注入漏洞,不能获取具体的数据库信息。
阅读全文