听说这个比较好入门就下载下来练习代码审计了
可以看到对filename参数没有任何的过滤
在 /inc/stopsqlin.php下,
可以看到对 get、 post 和cookie中的接收的内容都在zc_check函数进行过滤
主要使用了addslashes函数 ,也就是说 会对单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符) 进行转义
那么想找sql注入的话常见的有以下几种思路:
1.SQL语句中传参无单引号闭合
2.字符串编码绕过
这个问题主要利用一些编码对转义的特殊字符进行编码,第一种情况是当数据库编码格式设置为GBK时,可以实现宽字节注入,第二种情况是使用了iconv()或mb_convert_encoding()进行编码绕过
3.Sprintf()格式化字符串函数漏洞
4.超全局变量$_SERVER
比如 $_SERVER['PHP_SELF'] $_SERVER['HTTP_HOST']
在第五行可以看到 $_SERVER [‘HTTP_HOST’] 没有进行过滤就直接拼接了,查找包含调用 zt/top.php文件的来进行利用
比如利用 http://127.0.0.1/zt/companyshow.php
第67行,很明显看到这边对post方法传进的id没有进行过滤
首先注册用户要企业用户,用户要通过审核后才能发布招商信息
$_REQUEST 调用接受action的动作
当action为modify的时候
调用 check_user_power函数,传参set_text_adv
跟进 check_user_power
将传进的值set_text_dev与查询出的config的内容用函数str_is_inarr对比,返回no
因为积分模块默认开启,向setAdv函数传值1
接下来要让 $a+$b==0不成立
因为zzcms_main里面存的是对应用户的招商信息,我们只要发布一条招商信息就可以让$a=1,然后设置广告语后就可以进行构造语句注入了
第十行这边从从cookie中获取pxzs的内容,然后直接没有引号闭合就在第45行进行拼接,导致sql语句可控,利用sqlmap来进行注入
在showcookiezs函数中,第十六行sql语句将cookie中接收的zzcmscpid没闭合直接拼接
查找调用showcookiezs的函数,在fix函数中被调用,而且要当标签为cookiezs的时候才能执行,继续查找调用fix的函数
发现在label.php的第十二行的showlabel函数中调用
也就是要查找调用showlabel函数,而且传进去的$str 带有标签 cookiezs 的
查找发现有2个符合,分别是 zs/search.php 和 zs/zs_list.php
zs/search.php
$fp="../template/".$siteskin."/zs_search.htm"; $f = fopen($fp,'r'); $strout = fread($f,filesize($fp)); ... $strout=showlabel($strout); echo $strout;
zs_list.php
$fp="../template/".$siteskin."/".$skin; $f = fopen($fp,'r'); $strout = fread($f,filesize($fp)); ... $strout=showlabel($strout); echo $strout;
传入action为modify的话会执行 modify函数 ,跟进 modify函数
目标是触发218行的markit函数,可知,当传入id不为0的时候,并且根据你要修改的id从 zzcms_ask表里面查询出来的编辑者不是当前用户的话,那么就会触发 markit
跟进 markit 函数,发现使用$_SERVER[‘HTTP_HOST’]来进行拼接,直接在host头部构造xss语句
因为还有$_SERVER[‘REQUEST_URI’],也可以在请求的url中构造,但是要注意在inc/stopsqlin.php中有过滤
if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){ die ("无效参数");//注意这里不能用js提示 }