文章来源:SecHub网络安全社区(https://sechub.com.cn)
本资料仅供学习参考,严禁使用者进行未授权渗透测试!严禁任何形式的转载!
SQL注入介绍
SQL注入就是指Web应用程序对用户输入数据的合法性没有做校验或校验被绕过,导致前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的 SQL 语句来实现对数据库的任意操作。
用户输入带有恶意SQL语句的参数成功拼接到动态SQL语句中,并且拼接后的SQL语句成功作为参数传入后端进入数据库中,在数据库中完成执行。
预设动态SQL语句
一般情况下,开发人员会使用动态SQL语句创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。
以PHP操作SQL的语句为例,下面的语句就是一个预先定义好的动态SQL语句,其中的id的值来源于前端传递的参数,该语句作用是查询指定id的信息。
$query ="SELECT * FROM users WHERE id= $_GET['id']"
由于这里的参数ID可控,且带入数据库查询,所以非法用户可以在ID这个参数中拼接任意恶意SQL语句进行攻击。
可以思考下,我们插入的恶意SQL语句会出现在预设动态SQL语句的哪个位置?
会出现在动态参数【id】处,原id='1',我们插入 '#,则id='1'#',插入的位置是id='1后面
当然,SQL注入按照不同的分类方法可以分为很多种,最常用的分类为联合查询注入、报错注入、布尔盲注、延时盲注等。
1.一个登录框引发的思考
首先我们准备一个登陆页面
index.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<form method="post" action="login.php">
<input type="text" name="username">
<input type="text" name="password">
<button>登录</button>
</form>
</body>
</html>
login.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<?php
if ($_POST['username'] && $_POST['password']) {
$conn = mysqli_connect("localhost","root","root","lyb");
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM USER WHERE username='$username' and password='$password'";
$result = mysqli_query($conn,$sql);
if (mysqli_num_rows($result) > 0) {
echo "登陆成功";
}else{
echo "登录失败";
}
}else{
echo "账号名或者密码不能为空";
}
?>
</body>
</html>
记得在mysql数据库里面创建相应的数据库、表和字段
在用户名出输入’or 1=1#
密码处可以随意输入任意值
点击登录直接登录成功,这个就是一个典型的万能密码案例
我们输出一下后台查询的sql执行的语句
'or 1=1#到底是什么?
为什么会导致我们不用正确的用户名和密码就能直接登录成功
2.什么是SQL注入
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
1)用户向WEB应用请求id=1的数据信息
2)WEB应用根据用户传递信息,拼接sql语句发送至数据库
3)数据库执行sql查询语句并把查询结果返回给WEB应用
4)WEB应用后台数据处理给前端,最终展示给用户
1)攻击者在请求数据中拼接自己的语句
2)WEB应用没有对id参数进行过滤,直接拼接攻击者的sql语句到查询语句中发送给数据库查询
3)数据库执行sql查询语句并把查询结果返回给WEB应用
4)WEB应用后台数据处理给前端,最终展示给攻击者查询结果
用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。
其成因可以归结为以下两个原因叠加造成的:
程序编写者在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL查询语句中。
在程序登录验证模块的SQL语句是这样构成的:
select * from admin where username='$username' and passwd='$password'
这个时候在当我们用户名输入 ’ or 1=1# 密码输入12345时,SQL如下所示:
select * from admin where username='' or 1=1#' and passwd='12345'
( 井号 # 在Mysql是注释的作用,因此Passwd没起作用。)
3.哪里可能存在SQL注入
在http请求中sql注入点通常存在在get,post请求中。但是有几个地方也不能忽略,如:
cookie:识别用户的唯一标识
主机头:指定请求资源的internet主机和端口号
引用站点头(host):指定获取当前请求的资源
用户代理头(user-agent):确定用户使用的web浏览器。
来源页面(Referer):记录用户是从哪个页面跳转过来的
服务端有很大可能将这些数据存入数据库中。攻击者可以将这些数据篡改为攻击语句。是服务器存入数据库。
4.SQL注入的危害
1)数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
2)网页篡改:通过操作数据库对特定网页进行篡改。
3)网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
4)数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
5)服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。