本文最后更新于:2019 , 八月 19日 星期一, 1:05 下午

扯淡

瞎搞了2个小时,盘Sql注入,发现有一个php文件可能存在
结果看到被函数过滤了,在这里求助了九世
说该处只有在GBK编码的情况下,才能进行注入绕过
九世测试了下,发现一个搜索型的注入
而我,则是发现一处注入结果在最后绕不过列表名的转义
总结:总有一天我要砍代码九条街

过程

刚刚学习代码注入,就从大局把握开始审计学习

  • index.php
require_once('sys/config.php');
require_once('header.php');

发现它开头包含了两个文件,我们进行跟进

  • config.php
error_reporting(0);
if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock')){
    header("Location: /install/install.php");
    exit;
}
include_once('../sys/lib.php');

对文件进行了判断,然后包含了lib.php文件

  • lib.php

在该文件中,我们发现有一个自定义的sql注入过滤函数

function sqlwaf( $str ) {
    $str = str_ireplace( "and", "sqlwaf", $str );
    $str = str_ireplace( "or", "sqlwaf", $str );
    $str = str_ireplace( "from", "sqlwaf", $str );
    $str = str_ireplace( "execute", "sqlwaf", $str );
    $str = str_ireplace( "update", "sqlwaf", $str );
    $str = str_ireplace( "count", "sqlwaf", $str );
    $str = str_ireplace( "chr", "sqlwaf", $str );
    $str = str_ireplace( "mid", "sqlwaf", $str );
    $str = str_ireplace( "char", "sqlwaf", $str );
    $str = str_ireplace( "union", "sqlwaf", $str );
    $str = str_ireplace( "select", "sqlwaf", $str );
    $str = str_ireplace( "delete", "sqlwaf", $str );
    $str = str_ireplace( "insert", "sqlwaf", $str );
    $str = str_ireplace( "limit", "sqlwaf", $str );
    $str = str_ireplace( "concat", "sqlwaf", $str );
    $str = str_ireplace( "\\", "\\\\", $str );
    $str = str_ireplace( "&&", "", $str );
    $str = str_ireplace( "||", "", $str );
    $str = str_ireplace( "'", "", $str );
    $str = str_ireplace( "%", "\%", $str );
    $str = str_ireplace( "_", "\_", $str );
    return $str;
}

然而,该处的过滤函数存在着问题

$str = str_ireplace( "&&", "", $str );
$str = str_ireplace( "||", "", $str );
$str = str_ireplace( "'", "", $str );

利用这三个问题转义,我们可以成功绕过一些被该函数转义的关键字

例如:unio||nselec&&t

该文件下方,还定义了一个clean_input函数进行过滤

function clean_input( $dirty ) {
    return mysql_real_escape_string( stripslashes( $dirty ) );
}

其他的页面被该函数过滤了,绕了我好久都没绕过

我们此处可以进行全局搜索sql语句,进行注入(找到了过滤的,查看下能够进行sql注入)

Ps:千万不要和我一样一直盘一个地方,要多尝试

此处,我们的语句:select *

  • messageDetail.php
if ( !empty( $_GET['id'] ) ) {
    $id = sqlwaf( $_GET['id'] );
    $query = "SELECT * FROM comment WHERE comment_id = $id";
    $data = mysql_query( $query, $conn ) or print_r(mysql_error());

此处并没有过滤就执行了,不过该注入点在留言板中,所以你需要一个留言

由于该出我们并不需要进行闭合,直接进行注入即可(盲注,延时注入)

id=1 an&&d if((1=2),1,500)

我这的靶场可能有点问题,所以这里的图暂时放不了,有空补上

搜索型注入

这里就交给九世了

https://422926799.github.io/2019/02/01/VAuditDemo-shooting-range-message-search-injection/


代码审计   PHP      PHP代码审计

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

vauditdemo二次注入 复现
代码审计之文件读取