web安全sql注入初识

web安全漏洞的本质:漏洞特定函数,传入可控变量,过滤形式。

sql注入原理本质:攻击者构造恶意的sql语句带入可能存在对数据库操作的可控变量如id,由于对特定函数没有经过严格的过滤,就导致了攻击者直接对数据库进行查询等操作。


	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.'
'
;//输出变量sql $result=mysql_query($sql);//执行变量sql里的SQL语句 if($row=mysql_fetch_array($result)){ //对执行的结果进行显示 echo $row['title'].'
'
; echo $row['content'].'
'
; } ?> //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,数据库下有表名、列名、数据
web安全sql注入初识_第1张图片
数据库下的表名
web安全sql注入初识_第2张图片
查询表里面的字段
web安全sql注入初识_第3张图片
id为1的字段
web安全sql注入初识_第4张图片
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
web安全sql注入初识_第5张图片

你可能感兴趣的:(web安全,数据库,web安全,安全)