网安学习-代码审计

目录

漏洞关键字

实例-Beescms存在SQL注入漏洞

实例-Beescms存在文件上传漏洞


漏洞关键字

SQL注入:

        select insert update mysql_query mysqli等

文件上传:

        $FILES,type="file",上传,move_upload_file( )等

XSS跨站:

        print,print_r,echo,sprintf,die,var_dump,var_export等

文件包含:

        include,include_once,require,require_once等

代码执行:

        eval,assert,preg,replace,call,user,func,call_user_func,array等

命令执行:

        system,exec,shell_exec,``,passthru,pcntl_exec,popen,proc_open等

变量覆盖:

        extract() parse_str() importrequestvariables() $$

反序列化:

        serialize() unserialize() _construct _destruct等

通用关键字:

        $GET $POST $REQUEST $FILES $SEVER

实例-Beescms存在SQL注入漏洞

        看sql注入漏洞,刚开始代码审计,看着大佬们的代码审计的过程去学习和练习,希望大佬们轻喷。

首先是来到后台登录网页,尝试使用账号admin,密码123456进行登录。

我们输入的密码不正确,系统提示我们输入的密码不正确,页面将在x秒之后自动返回上一页。尝试在admin账号后面加上单引号。发现报错。

之后我们通过url中的路径,去审计代码。也就是/admin/login.php文件,在文件中搜索参数action。

分析一下,如果分析错了,希望可以相互交流指出我的错误,谢谢。

如果存在着通过GET方式请求的action,那么就会将参数的值赋值给action,否则的话,action的值就等于login。接下来就是判断,如果action的值等于login,那么声明全局变量sys,并且包含/template/admin_login.php,否则如果action的值等于ck_login,那么就先声明全局变量submit、user等关键字,通过POST请求submit。接下来就是通过两个函数来经过POST方式请求账号user和密码password。这两个函数分别是fl_html( )以及fl_value( )。

接下来就是去定位这两个函数:

发现fl_html( )以及fl_value( )这两个函数均定义在了fun.php这个文件中。

两个函数的代码如下:

function fl_value($str){
	if(empty($str)){return;}
	return preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/i','',$str);
}

function fl_html($str){
	return htmlspecialchars($str);
}

一看这个fl_value()函数就是过滤的,经过正则匹配,过滤了很多的关键字和字符。正则匹配到以上的关键字,就会将对应的关键字替换为空,所以这里是不是可以使用双写来绕过呢?

fl_html函数体中,调用了htmlspecialchars()函数,查询函数,得到该函数的用法:

htmlspecialchars函数的作用就是将一些特殊字符转换为html实体。

这里没明白,转换完这不是没变化嘛?搞不懂了,感觉就是这漏洞通过双写来绕过吧。

接下来就是测试了。

一开始我们已经判断出了是存在报错注入的!接下来就是数据库名,字段数等等。

这里就已经判断出来了存在着5个字段。

接下来就是判断回显点。

爆数据库名的时候and被过滤,所以可以尝试空格+双写来绕过。

payload:-admin' an and d updatexml(1,concat(0x7e,selselectect database(),0x7e),1)#

之后就是查表名、列名。

在查询表名的时候,我们已经知道了他过滤select、from、where,这里还是通过空格+双写来绕过。

第二张表:

 之后还存在着很多表,这里不进行一一爆破了。、

之后就是爆列名:还是空格+双写绕过

之后爆字段:

先爆账号,得出账号存在一个,为admin。

之后再爆密码:

密码得到了,md5解密,得到了admin。尝试登录(这里就不去登陆了,毕竟已经知道了默认账号密码都是admin)

实例-Beescms存在文件上传漏洞

        接下来继续审计,搜一下文件上传的函数$_FILES

选择第一个进去看一下。

我们先去访问一下这个路径,尝试抓包上传试试。

可以看到有个白名单显示给我们,尝试上传抓包。

在上面的代码的图片中,我们可以看到有几个接受的参数。做以下分析:

$submit=$_POST['uppic'];         //通过POST方式接收uppic赋值给submit变量

$up=$_POST['up'];        //通过POST方式接收up的值赋值给up变量


$file_info=fl_html($_POST['file_info']);        //先通过POST方式接收file_info的值,然后经过fl_html函数(上面的sql注入的时候介绍到了该函数,他的作用就是将一些特殊的字符转换为html实体)赋值给file_info变量

这些代码大体上就是是否有上传的文件,如果有,那么获取文件的上传时间,获取文件的大小,第一行的意思是控制接收片的大小。

大体上就是这个样子,后面有一条sql语句,就是将我们要上传的文件的大小,路径,上传的时间插入到表中。查询一下is_upload_file函数。

is_upload_file函数:判断文件是否是通过HTTP POST上传的。

is_uploaded_file(string $filename): bool

如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 true。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

全局搜索一下这个函数:

找到fun.php这个文件的时候,看到了对上传文件的检测。

他会检测我们上传的文件的大小、文件的类型也就是说文件的格式。如果上传的文件格式不在白名单中,会提示我们上传图片格式不正确。之后跟进一下变量$file_type。

 发现他的值是由$pic_name赋值的,而上面的语句便是$pic_name的来源,经过了一个函数pathinfo。查询该函数的用法:

pathinfo-----返回文件的路径的信息。

看个例子:

<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";
?>

该代码段会输出:

/www/htdocs/inc
lib.inc.php
php
lib.inc

[dirname]:目录路径

[basename]:文件名

[extension]:文件后缀名

[filename]:不包含后缀的文件名

这里就明白了通过[extension]获取到我们上传的文件的后缀名,之后拿着它与白名单进行对比。到这里差不多这部分的代码审计就结束了,经过抓包修改MIME等信息,没有漏洞emmmmmmmmmmmm

继续寻找上传点,发现了另一处上传的地方。

之后去翻他的代码。

上面的判断方法都是一样的,但是在up_img函数这里就存在着问题了。全局搜一下该函数。发现他是判断文件各种信息的函数

发现他这里只是检测了上传的文件的MIME头。并没有对文件的类型进行检测。所以我们在这里尽可以通过上传一个图片文件,将他的后缀名直接修改为php。

 我没有找到他回显的上传文件成功的路径,这里我看到大佬的文章,翻到了上传的文件在/upload/img/文件夹下面

尝试蚁剑连接就可以了。

这里已经能执行phpinfo了,我就没有再去连接蚁剑。

猜你喜欢

转载自blog.csdn.net/weixin_44770698/article/details/125656478