前言:
第一次接触代码审计的小白,要是过程有哪里出现错误或者是理解不好的地方希望各位前辈的指点!!!也希望可以对一些刚刚接触或者是想接触代码审计的同学能提供一点点思路。
正文:
思路:我对这个漏洞的审计过程是先关注漏洞POC发现漏洞位置然后根据正常的功能走一遍,再把POC带进去走一遍,因为我觉得先正常的功能走一遍能对代码的运行有一个大概的了解,再带进POC走一遍能更好的理解漏洞的成因
第一步环境的搭建因为网上关于PHPCms环境搭建的文章比较多,所以这里就不多介绍啦
第二步我们关注POC:
siteid=1&modelid=11&username=test2&password=test2123&[email protected]&info[content]=<img src=&dosubmit=1&protocol=" target="_blank">http://127.0.0.1/phpinfo.txt?.php#.jpg>&dosubmit=1&protocol=
这里他出现问题是地方是注册的位置。代码位置:D:\phpStudy\PHPTutorial\WWW\PHPCMS\install_package\phpcms\modules\member\index.php
我们就正常的注册一个账户然后进行代码追踪看看他的实现过程。
正常提交内容:siteid=1&modelid=10&username=H12345&password=123456&pwdconfirm=123456&[email protected]&nickname=HAsdsd&info[birthday]=2022-12-02&dosubmit=同意注册协议,提交注册&protocol=
和POC里面modelid不同还有一个info后面的参数也不同可以重点关注一下。
跟踪正常代码:
定位到dosubmit这边:
如果你提交是注册的值的话,那么就进入注册的流程,我们上面正常的提交内容就是注册的,继续往下走下面有验证邮箱和验证手机的代码因为我们这里没有进行打开所以不需要进行关注,到这里我们已经定位完了dosubmit变量
下面有一个get($_POST['info'])我们跟进去这个参数
来到了\caches\caches_model\caches_data\member_input.class.php这个目录下面继续跟进,看见了另外一个重要的参数$func,他被赋值上了datetime,这边就是对$value这个参数用datetime这个函数进行处理,$value在上面被$data赋值,$data就是我们传进来的参数.(后面在验证POC的时候会对这步做详细的解读)
我们在数据库v9_model_field这个表里面找到这2个参数,一个是modelid=10和datatime
我们继续跟进代码后续只是对这个参数进行效验然后吐了出来
后续就是对用户信息的插入和生日插入,分别插入2张表,一张是v9_member(用户表),一张是v9_member_detail。
后续的报错也是因为这张表。
上面就是正常注册的流程,我们走完了一遍对这个注册的流程有个大概的了解,接下来我们来提交POC看看他在代码里面是怎么运行的,漏洞挖掘者是怎么想的。
抓包,修改正常注册的参数,放包。
还是一样经过了邮箱验证和手机验证(因为都没有开,所以都跳过)
在赋值的时候他用了回调函数用了new_html_special_chars函数,是一个防止XSS的函数所以尖括号等等东西都被进行了编码。
还是和之前一样跟进get($_POST['info'])看看在里面处理有没有什么不同,他传进去的值先传给了$data
然后下面又把$data值传给了$value,所以我们下面继续关注$value(对刚刚正常注册流程的解读)
然后对$value值在v9_model_field查找,匹配到了formtype为edito,然后进入到edito函数对$value进处理.
跟进到edito函数下面发现对变量进行了下载,我们跟踪进去看看他怎么对这个下载链接进行处理
在下面他用对$value用new_stripslashes函数赋值给$string,所以我们这边关注$string
下面又对这个下载链接进行正则匹配是不是满足上面符合要求的后缀符合的话把$string赋值给$matches不满足的话直接返回$value
因为我们是满足的所以我们继续关注$matches,经过上面的正则表达式,我们下载链接外面一些不必要的东西也被除去掉了,下面用把matches[3]赋值给$matche,所以我们关注$matche这个值
下面又对matche进行处理我们跟踪查看,并且赋值给$remotefileurls
跟进函数发现链接被赋值给了$surl,所以我们下面继续关注$surl这个函数
发现他用一个strpos函数来截取第一次出现#的地方所以我们#后面的东西都被去掉了
上面函数跟踪出来我们已经知道#.jpg怎么处理掉的,因为处理完他赋值给了$remotefileurls,所以我们关注$remotefileurls这个函数。在下面他又把$remotefileurls赋给$file,我们关注$file
$file我们可以看到下面他用了一个fileext来获取文件类型因为我们是php文件后缀所以获取到的是PHP文件,然后获取到本地上传路径,再用copy的形式把刚刚下载链接里面的东西复制生成一个文件到本地目录下面,就是$newfile这个文件
在本地成功的生成20221231115044183.php这个文件
到这边我们已经知道他是怎么在本地生成代码的,我们现在还有一个问题没有解决为什么会报错然后爆出路径呢,我们继续往下执行代码,回掉到注册代码位置,还是和之前正常注册流程一样先插入用户到v9_member,和把生日插入v9_member_detail,但是我们这里输入的恶意代码在插入的时候与表里的字段不匹配所以发生了报错。
总结:上面就是我对PHPCMS9.6这个代码审计的全部过程和方法,可能知道POC只是知道有这个漏洞,知道这个漏洞该怎么用,我觉得想要学好就必须对这个漏洞的原理和形成过程有所了解,学习挖掘者的思路,挖到属于自己的漏洞。因为是第一次接触代码审计,所以有什么不足的地方和需要改进或者是理解不够的地方希望各位师傅可以指点,同时也可以希望对刚刚学习和我一样的小白有帮助的地方。
还没有评论,来说两句吧...