起风了之9ccms1.7版代码审计

时间:2024-03-17 20:29:14

0x00 后台密码修改处getshell

a) 漏洞原因:对输入的账号密码等只进行了stripslashes()和htmlspecialchars()两个函数过滤。
b) 漏洞位置:www.xxxx.com/adminx/admin_security/security_userpass.php
起风了之9ccms1.7版代码审计
c) 源代码审计一下:
security_userpass.php相关代码:
起风了之9ccms1.7版代码审计
可以看到在此处包含了一个叫boss.php的文件,其中这个文件是用于存储账号密码文件的。
起风了之9ccms1.7版代码审计
从第88行代码可以看到,在接收到修改数据之后,代码只对提交的数据进行了简单的函数过滤,便拼接字符串,然后存储到boss.php文件中。修改密码成功之后再一次重定向到security_userpass.php当中,这样就可以触发之前的插入的shell了。之后我们看一下boss.php文件的存储结构。
Boss.php文件结构:
起风了之9ccms1.7版代码审计
采用define的方式宏定义了账号密码和IP白名单。既然如此,我们便可以构造一个这样的payload用于测试:

');echo ‘111111’;phpinfo();//

首先闭合之前的define,然后写入shell代码,因为之前的过滤函数只处理 \ < > 这些符号。
d) Getshell成功:
起风了之9ccms1.7版代码审计

0x01关于登录记录位置的存储型XSS探索学习:

a) 在很多系统后台位置都会存在日志记录的功能,有的只会记录登录成功的日志,有的会记录全部日志,其中可能记录一些用户可以人为控制的信息,例如登录IP地址,在这种情况之下就存在向某些信息插入恶意脚本,然后达到存储型xss的目的。
b) 系统日志记录位置:
起风了之9ccms1.7版代码审计
查看一下详细代码:
起风了之9ccms1.7版代码审计
通过代码可以看到,从136行代码开始未登录成功后的日志记录操作,在144行代码位置,通过使用

$_SERVER[‘REMOTE_ADDR’]

方式获取到登录IP地址,然后,写入日志文件,并在前面的日志记录位置显示。
c) 关于PHP获取客户端IP的三种方式:

  • $_SERVER[‘HTTP_X_FORWARDED_FOR’]与$_SERVER[‘HTTP_CLIENT_IP’]:’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是HTTP协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。
  • $_SERVER[‘REMOTE_ADDR’]:’REMOTE_ADDR’ 是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。

d) 根据上面的代码,获取IP的方式为‘REMOTE_ADDR’,使用了与客户端连接的真实IP,这种情况下我们便很难再篡改IP了。为了更加清楚的显示,做一个实验:首先我们使用127.0.0.1的IP地址登录后台,拿到一条记录,然后通过修改hosts文件,将IP绑定到本机的外网网卡再获取一条登录记录。

起风了之9ccms1.7版代码审计
这就很好理解了,第一次通过127.0.0.1连接时,与服务端连接的客户端IP肯定是本机的环回网卡地址,而第二次连接的时候客户端IP肯定是连接外网的网卡IP了。在这种无法篡改IP的情况下,实际无法插入恶意的代码了。但是之前挖洞遇到过可以通过篡改IP地址的方式插入恶意脚本的情况,所以我们将上述代码做一些小的修改,采用XFF头来获取客户端IP地址:

起风了之9ccms1.7版代码审计
e) 通过登录时篡改X-Forwarded-For请求头来插入恶意脚本代码:
首先正常访问,查看通过XFF头是否获取到IP地址:
起风了之9ccms1.7版代码审计
起风了之9ccms1.7版代码审计
插入恶意IP信息,造成存储型xss:
起风了之9ccms1.7版代码审计
起风了之9ccms1.7版代码审计