前言:
在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方 法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取, 后续安全测试中我们也必须满足同等的操作才能进行注入。
简要明确参数类型
数字,字符,搜索,JSON 等
数字:如果是数字的话可能不存在单引号,对方在数字上加单引号也是有可能的,要看对方的写法
字符:一般是采用单引号,如果参数是字符的话那肯定是有单引号的,即使有注入也会带入单引号里,产生不了任何作用,所以我们要做的前提是先要把它的符号闭合掉,也有可能有括号,注入的时候只有一点点去尝试
搜索:将数据进行搜索并进行展示,搜索符号是%,在过滤的时候要过滤单引号和百分号,不然你的语句全部在单引号和百分号里
简要明确请求方法
根据网站的情况来获取相应的请求方法,请求方法可以通过在访问网站的时候审查元素里数据包的前缀看查看,找到Request Headers(请求头)
不同的请求方式,它请求的数据类型或者大小都不同。一般大数据会采用POST提交。
在注入时候需要按照网站的请求方法去注入。
GET、POST、COOKIE、REQUEST、HTTP头等
GET方法无法接收POST的值在POST情况下GET的值只要在网址后面就能接收GET、POST接收单个REQUEST全部接收,
网站在访问的时候由于我们大多数是黑盒测试,不知道对方代码写法,如果对方采用REQUEST接收方式,就不需要考虑用何种方法去提交,因为用GET、POST都可以。如果对方是单一接收方式,那么在注入的时候需要用它的方法去注入。
$_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值,在数据包的某一个地方可以进行注入
其中 SQL 语句干扰符号:',",%,),}等,具体需看写法
演示案例:
参数字符型注入测试=>sqlilabs less 5 6
POST 数据提交注入测试=>sqlilabs less 11
参数 JSON 数据注入测试=>本地环境代码演示
COOKIE 数据提交注入测试=>sqlilabs less 20
HTTP 头部参数数据注入测试=>sqlilabs less 18
演示资源:
#配合 sqlilabs 本地数据库演示<?phpheader('content-type:text/html;charset=utf-8');if(isset($_POST['json'])){$json_str=$_POST['json'];$json=json_decode($json_str);if(!$json){die('JSON 文档格式有误,请检查');}$username=$json->username;//$passwd=$json->passwd;$mysqli=new mysqli();$mysqli->connect('localhost','root','root');if($mysqli->connect_errno){die('数据库连接失败:'.$mysqli->connect_error);}$mysqli->select_db('security');if($mysqli->errno){dir('打开数据库失败:'.$mysqli->error);}$mysqli->set_charset('utf-8');$sql="SELECT * FROM users WHERE username='{$username}'";echo $sql;$result=$mysqli->query($sql);if(!$result){die('执行 SQL 语句失败:'.$mysqli->error);}else if($result->num_rows==0){die('查询结果为空');}else {$array1=$result->fetch_all(MYSQLI_ASSOC);echo "用户名:{$array1[0]['username']},密码:{$array1[0]['password']}";}$result->free();$mysqli->close();}?>