web安全漏洞的本质:漏洞特定函数,传入可控变量,过滤形式。
sql注入原理本质:攻击者构造恶意的sql语句带入可能存在对数据库操作的可控变量如id,由于对特定函数没有经过严格的过滤,就导致了攻击者直接对数据库进行查询等操作。
<?php
header("Content-Type: text/html; charset=utf-8");
$id=$_GET['id'];
$conn=mysql_connect('localhost','root','root');//连接数据库
mysql_select_db('javaweb-bbs',$conn);//选择数据库名为javaweb-bss的数据库
$sql="select * from sys_article where id = $id";//组合定义SQL语句
echo $sql.'<hr>';//输出变量sql
$result=mysql_query($sql);//执行变量sql里的SQL语句
if($row=mysql_fetch_array($result)){
//对执行的结果进行显示
echo $row['title'].'<hr>';
echo $row['content'].'<hr>';
}
?>
//http://127.0.0.1/title.php?id=1
如上述php代码中文件名:title.php,参数:id,传入参数值:1
正常传入参数id=1,sql语句 $sql=“select * from sys_article where id = 1”;
构造后id=1 order by 5,sql语句 $sql=“select * from sys_article where id = 1 order by 5”;
那么这样构造后就会导致直接对数据库进行一些操作
判断是否存在注入点
方法1
http://127.0.0.1/title.php?id=1 and 1=1 页面正常
http://127.0.0.1/title.php?id=1 and 1=2 页面错误
就表示可能存在sql注入
select * from sys_article where id = 1 and 1=1 页面正常
select * from sys_article where id = 1 and 1=2 页面错误
具体原因 and 1=1 为真 and 1=2 为假
方法2
http://127.0.0.1/title.php?id=1 a
直接在参数后面加上任意字符,让传入的参数变得不可控
过滤形式
这里常规的过滤方式就是对$id进行过滤,因为id是传入进来的参数,比如限制它只能传入数字这样就行了一个过滤
Mysql数据库结构
Mysql数据库 数据库A对应网站A,数据库下有表名、列名、数据
数据库下的表名
查询表里面的字段
id为1的字段
mysql的数据结构大致就这样
单参数与多参数
单参数 http://127.0.0.1/title.php?id=1
多参数 http://127.0.0.1/title.php?id=1&page=2&name=3
无参数 http://127.0.0.1/title.php
单参数直接通过对应的id传参来测试,多参数的话就尝试发现每个传入的参数点哪一个存在漏洞,如id存在漏洞
http://127.0.0.1/title.php?id=1 and 1=1&page=2&name=3
http://127.0.0.1/title.php?id=1 and 1=2&page=2&name=3
那么工具测试的话就可以把id反正后面,也可以给一个参数让工具来判断
http://127.0.0.1/title.php?page=2&name=3&id=1
无参数可能无法注入,那么无参数就可以通过post请求传参来判断sql注入点
搭建sql注入环境sqli-labs
https://github.com/Audi-1/sqli-labs
转载:https://blog.csdn.net/qq_36241198/article/details/116001409