最土团购某基础函数过滤不全导致大量sql注入漏洞

漏洞作者: menmen519

include/library/DB.class.php(128-134):

[php]
static public function GetDbRowById($table, $ids=array()) {

$one = is_array($ids) ? false : true;

settype($ids, 'array');

$idstring = join('\',\'', $ids);

if(preg_match('/[\s]/', $idstring)) return array();

$q = "SELECT * FROM `{$table}` WHERE id IN ('{$idstring}')";

$r = self::GetQueryResult($q, $one);
[/php]

 

发现传递进来的参数,进行处理后变为$idstring ,在此期间 只是做了空格检测,并没有做其他特殊字符的过滤,然后直接进入查询,故而导致sql注入

辐射的文件有:

account/bindmobile.php
ajax/chargecard.php
ajax/coupon.php
api/call.php
......

 

拿其中第一个举例说明:

[php]
<?php

require_once(dirname(dirname(__FILE__)) . '/app.php');

if ( $_POST ) {

$userid = $_POST['userid'];

$update['mobile'] = $_POST['mobile'];

$user = Table::Fetch('user', $userid, 'id');
[/php]

 

这里$userid并没有做任何处理,就传递过去了,我们构造url为

15115127d3e8d3fb396a435eb866369c31a66037

 

通过监控器,发现sql语句完整执行:

SELECT * FROM `user` WHERE id IN ('sssssssssssssssssssss',sleep(5))#')

发表评论