记一次代码审计
2020-09-09 10:46:58 Author: forum.90sec.com(查看原文) 阅读量:463 收藏

下载好源码数据库啥都弄好

工具:

  • phpstudy 搭建环境

  • seay 自动审计危险操作

  • phpstrom 调试和跟进搜索

  • burp 构造http包

使用seay进行一次自动审计,发现这个文件里面有个sql语句变量无单引号包裹,点击去看下

becc82a5e50dbfb781d8d00ffdb2ca73

很好,发现直接从Cookie中获取 asksmallclassid 的value并且拼接在sql语句上执行,而且打印了 classid

和 classname 这两个字段的查询结果

1

往上翻发现代码是写在 add() 方法里面

2

那么就要找到调用 add()方法的地方,phpstrom下按住Ctrl键点击左键可以找到,同样是在/admin/ask.php 下

3

随后我在sql语句下面加个了打印sql语句查看情况

4

然后使用burp发包测试

5

果然代码审计的路上不会一帆风顺,出现了拦截

于是使用phpstrom进行全局搜索报错的信息 "参数中含有非法字符"

Ctrl+shift+f 可以进行全局搜索


点击去发现是在 stopsqlin.php 文件下有个stopsqlin方法,里面对SQL注入的一些关键字进行了拦截


然而这里有意思的是下面的代码写的不够严谨

那就是必须要满足这三个条件才调用sql注入检查:

strpos($r_url,"siteconfig.php")==0 && strpos($r_url,"label")==0 && strpos($r_url,"template.php")==0

r_url=strtolower(_SERVER["REQUEST_URI"]);

也是就是从url中匹配那三个关键字,都没有出现就进行过滤,反之但凡出现了一个就不会过滤,我猜原本这里是想弄个白名单,不对站点配置文件跟模板处理文件进行过滤,可是这却出现了一个bug,那就url我们是控的,于是可以手动的加上白名单关键字进行绕过,添加个参数 label=label 进行绕过拦截

果不其然,成功绕过


因为有回显,所以可以构造联合注入进行注入,我直接到数据库下看下表有多少列

发现是11列,并且有回显的位置是 1 和3


那就直接注入把,cookie处payload :askbigclassid=1 union select database(),2,user(),4,5,6,7,8,9,10,11#

可以看到查询出了当前库名和用户

其实导致这个注入很大的原因除了sqlstopin写的不够严谨外,还有一个原因就是admin目录是属于管理端的,

因该要有相关的权限校验,当我跟进权限校验文件里后,才知道了问题所在


当权限校验完发现没有权限并没有直接退出执行,而是抛出一个重定向


那么这就会导致主动文件包含的文件下面的代码依旧会执行,而不会 exit()

也就是这其实造成了一个无条件的前台sql注入


文章来源: https://forum.90sec.com/t/topic/1282/1
如有侵权请联系:admin#unsafe.sh