代码审计-记对xx商城的一次审计

举报
亿人安全 发表于 2023/05/31 23:55:56 2023/05/31
【摘要】 title: 某商城代码审计date: 2021-09-04 08:26:42tags: - web - PHPcategories: - 代码审计comments: true审计开始第一处先来到admin.php页面 先不登录查看源码admin.php 页面require()引入了一个common.php页面 require()是php的内置函数,作用是引入或者包含外部php文件。 工作原...
title: 某商城代码审计
date: 2021-09-04 08:26:42
tags:
 - web
 - PHP
categories:
 - 代码审计
comments: true

审计开始

第一处

先来到admin.php页面 先不登录

查看源码

admin.php 页面require()引入了一个common.php页面 require()是php的内置函数,作用是引入或者包含外部php文件。 工作原理:当本身php文件被执行时,则外部文件的内容就将被包含进该自身php文件中;当包含的外部文件发生错误时,系统将抛出错误提示,并且停止php文件的执行。 注意:使用require时,一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误 。 然后接着往后面看

这里发现一个sql语句 看起来是没有什么防护的 可能有突破 忘前面看 寻找$m

在28行和29行发现$m 有两种发送赋值 一种是通过file_get_contents函数 另一种是 如果$m是空的话 就自动赋默认值 默认值没什么看的 我们不能控制 我们看看这个file_get_contents函数 file_get_contents() 函数把整个文件读入一个字符串中。 然后在file_get_contents函数内部发现了php://input 输入流 php://input可以读取没有处理过的POST数据 所以这里就导致了 post数据可控 然后继续往下看

$m会调用一个Dec函数 我们跟进这个函数

这个函数使用了json_decode函数 json_decode — 对 JSON 格式的字符串进行编码

说明 输入流传入的数据需要json格式 然后继续往后看 return会判断$c的值 false的话 就直接把解码后的json数据返回出去 但是前面代码调用的时候传入的true 所以会返回一个函数Rpl 继续跟进这个函数

这个函数用到了foreach is_array is_string 等函数 Foreach函数是用来遍历数组的

Is_array函数是判断变量是否为数组 Is_string 同理 判断是否为字符串

所以这个函数的大概意思就是 将解码后的json数据 通过foreach遍历为键值的形式 值为数组的话则递归调用 判断是否为数组 直到为字符串 才进入下一个判断 在下一个elseif里面 这通过str_replace 进行过滤 经过ascii码值 过滤掉 / * ‘ “ % 空格 然后返回过滤后的数据

然后回到admin.php页面 32行 判断$m[‘act’]的值是否为idx和lgn 因为用的&& 所以只要同时不等于两个 就会进入if 执行sql 又因为前面过滤掉的字符对sql语句影响不大 直接构造语句

来到admin.php页面然后刷新抓包

然后改变请求方式

构造

payload: {“act”:”ttt”,”uid”:”123||sleep(5)”} 延时5秒 因为没有回显位 尝试盲注

也是可以的 后面盲注就不继续测试了

第二处

通过审计工具发现一处可能存在注入的地方

然后跟进

发现是在会员保存的地方 属于需要进入后台 我们先登入后台 来到会员保存的地方

然后点击保存抓包

然后通过代码分析

要$m[‘ID’]的值乘1不为0 才会进入else 所以进行改包

下面这个if是通过$m[‘Nm’]判断名字是否重复 如果重复的话就终止后续执行了 所以名字随便也改一下 然后来到第二个if 里面有sql语句

只看到这个ID这个位置 后面先不看 这里没有过滤 等操作 也没有单引号 直接构造

payload:{“act”:”suv”,”uid”:”1”,”sid”:”zC1fEUcZ0CZAHAde”,”ID”:”1||sleep(5)”,”Nm”:”12653”,”Nc”:”123”,”Np”:”123”,”Ne”:0,”Nv”:0}

延时注入一枚

第三处

通过审计工具找到员工删除这里

员工删除的地方 没有单引号等保护或者过滤 直接先来到员工管理页面

因为是本地搭建的原因 有些无法显示 但不影响 我们操作 因为删除 和添加 也只是参数不一样嘛 直接先添加员工 然后抓包

Sav是员工保存的包 我们把它改为sad

然后因为这里没有防护 直接构造

payload:{“act”:”sad”,”uid”:”1”,”sid”:”zC1fEUcZ0CZAHAde”,”ID”:0||sleep(5),”Nm”:”123”,”Np”:”123”,”Nr”:””}

放包 但是发现报错了 不要紧 我们全局搜索下这个报错

发现是在json解码的时候报错了 回来在看数据包 发现没有添加引号 所以报错了 我们加上在试试

Payload:{“act”:”sad”,”uid”:”1”,”sid”:”zC1fEUcZ0CZAHAde”,”ID”:”0||sleep(5)”,”Nm”:”123”,”Np”:”123”,”Nr”:””}

成功延时

第四处

找到一个运费删除的地方 和上面的差不多 都是通过case 判断进入

这里和上面同理 直接改掉act的值为syd 然后放包

延时成功 后续还有优惠删除等 删除的操作 都有这个问题 没有给单引号保护以及过滤 都可以延时注入

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。