某商城代码审计

审计开始

第一处

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

1

查看源码

2

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

3

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

4

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

5

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

6

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

7

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

8

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

9

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

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

10

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

11

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

12

然后改变请求方式

13

构造

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

14

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

第二处

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

15

然后跟进

16

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

17

然后点击保存抓包

18

然后通过代码分析

19

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

20

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

21

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

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

22

延时注入一枚

第三处

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

23

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

24

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

25

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

26

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

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

27

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

28

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

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

29

成功延时

第四处

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

30

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

31

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


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!