一
参数的入口
这段话的意思时遍历三种提交的方法,获取参数传递的值。
有一个函数是daddslashes,跟进看一下。
这段代码的意思是对数据里的每一个字符都进行转义处理
二
漏洞产生的代码在faq.php195行
跟进implodeid函数,在faq.php的675行
这个函数的功能将数组里的值拆分出来,如图
到了这里我们知道,如果数组值当中存在在 / 或者 ’ ,那么在拼接sql查询语句的时候,/ 就会对后面的 ’ 进行转义或者多一个 ’ ,那么就会有一个单引号闭合不了,从而造成报错注入。
那么来看一下$groupids这个参数是从哪里传进来的
往上找,在faq.php的190行
由第一步分析知$gids是可以由我们传递的。
$gids就是我们构造传入的变量,从以上分析可以看出 全局对传入的参数进行了处理单引号会对 ‘ 处理为 /‘
这段代码是第一次调用$gids参数,把整段代码删除之后,发现还是发生了注入,证明这段代码并没有对数据进行过滤啥的。
第二次调用就到了sql语句执行的时候了。
因为KaTeX parse error: Expected 'EOF', got '&' at position 42: …load为gids[98]='&̲gids[99][0]=) o…action=grouppermission,所以构造完整的payload为
/faq.php?action=grouppermission&gids[98]=’&gids[99][0]=) or UpdateXML(50,concat(0x7e,(select group_concat(authkey) from uc_applications where appid=1),0x7e),1)%23’)
至于为什么要用二维数组,看以下代码
每次遍历取变量的第一个值,gids[98]的第一个值为/,gids[99][0]的第一个值为
) or UpdateXML(50,concat(0x7e,(select group_concat(authkey) from uc_applications where appid=1),0x7e),1)%23’),这两个值放进同一个数组,
至于为什么是从标号98开始,而不是从0开始,看以下分析
这段代码钟,如果
c
g
d
a
t
a
[
0
]
=
=
’
m
e
m
b
e
r
’
则
执
行
i
f
里
的
代
码
,
否
则
执
行
e
l
s
e
里
的
代
码
,
测
试
得
知
,
cgdata[0]==’member’则执行if里的代码,否则执行else里的代码,测试得知,
cgdata[0]==’member’则执行if里的代码,否则执行else里的代码,测试得知,cgdata[0]的值为system,所以gids[1]被占用了
所以最小是从gids[2]开始构造我们的payload
漏洞产生的原因
在这个函数进行切分的时候,并没有考虑到数组的数据当中有/,可以加一个判断过滤。