大米CMS一处sql注入

\Web\Lib\Action\MemberAction.class.php文件中 147-163行

可以看到aid这个参数aid被intval了

可是在我测试的时候,却发现aid这个参数是可以注入的。

再往上看。

开头

看下R这个函数

/Core/Common/functions.php

再来看看A

/Core/Common/functions.php 

意思就是调用一个远程模块。

而回头看\Web\Lib\Action\MemberAction.class.php

R('Public','head');

结合函数A 和 R也就是调用了PublicAction前台公共action,里面的head函数。

我们再来看下head函数

/Web/Lib/Action/PublicAction.class.php

看这里

//位置导航

这个aid没有经过过滤直接就带入到了sql中。

getField函数。

/Core/Lib/Think/Core/Model.class.php

获取一条记录的某个字段值

所以,总结一下。

在我们注册一个用户之后

发布一个投稿,

然后修改他
 

1.png

 

2.png

这个分类,就是保存在数据库中的,上面说的所有内容,就是通过文章修改这个函数

获得aid参数,然后用aid这个参数从type中查找类型,显示出来。

而查找这个过程的aid却没经过过滤,导致了注入的产生。
 

3.png

SELECT * FROM dami_article WHERE dami_uid=6 and aid=129

日志里,下面的这个,就是在修改文章这个函数中的aid是经过Intval的

而上面的这个

105 QuerySELECT typeid FROM dami_article WHERE aid=129 LIMIT 1

105 QuerySELECT typename FROM dami_type WHERE typeid=14 LIMIT 1

通过get传进来的aid函数,从article表中查找出typeid,然后再从type表中根据typeid来查找类型的名字(typeid)。

http://127.0.0.1/dami/index.php?m=member&a=modpage&aid=129 and 1=2

所以一个完整的sql操作就是这样的

108 QuerySELECT typeid FROM dami_article WHERE aid=129 and 1=2 LIMIT 1

108 QuerySELECT typename FROM dami_type WHERE typeid= LIMIT 1

108 QuerySELECT path FROM dami_type WHERE typeid= LIMIT 1

108 QuerySELECT * FROM dami_article WHERE dami_uid=6 and aid=129 LIMIT 1

108 QuerySELECT typeid,typename,fid,concat(path,'-',typeid) as bpath FROM dami_type WHERE islink=0 and isuser=1 ORDER BY bpath

108 QuerySELECT * FROM dami_flash WHERE status=1 ORDER BY rank asc

108 QuerySELECT * FROM dami_link WHERE islogo=1 and status=1 ORDER BY rank asc LIMIT 8

108 Quit
 

4.png

 

 

解决方案:

在前台公共类(文件)

/Web/Lib/Action/PublicAction.class.php

把传入的参数intval一下。