0x01 Thinkphp 3.2.3 安装配置
1.1 环境
版本:Thinkphp full.zip
php环境版本5.6以上
服务器环境:phpstudy
使用工具:xdebug 、phpstorme
1.2 打开 TP 调试开关
设置定义应用目录,可以调整成我们自己设置的数据库。接着打开调试模式, 定义我们要用的应用目录,在前面得文章中讲过。这里不多赘述。
设置数据库 在ThinkPHP->Conf->convention.php文件夹下 复制我们的数据库设置代码,代码复制到Home->Conf->config.php下
配置控制器 修改IndexController.class.php内的代码。这个数据库是之前搞过二次开发的数据库。
1.3 打开日志设置
开启调试追踪 'SHOW_PAGE_TRACE'=>true,在config.php下(之前修改数据库操作的.php文件)
就会出现下面这种情况:可以看到数据的回显。
0x02 ThinkPHP 数据库操作分析
数据库操作路线:
1、M() 函数会自动创建一个new model类 并且实例化一个对象返回此资源
2、如果实例化comment 对象调用了where方法同时格式化处理然后会调用-->$options
3、对$options做一次分析:
4、接下来会调用find()方法,find()方法会先给‘user’对象的一个成员变量$options赋值,limit=1。然后进入select()
5、select()方法会直接buildselectsql()
直接看源码进行分析
准备的控制器:
按照我们上面的路线一步一步调试过来,分析一下数据库的操作
M()函数 实例化一个comment对象
M()->where()->find()
where()函数
where方法使用字符条件,并且支持预编译。
也就是说:普通的注入("id=%d and username='%s' and xx='%f'")然后会直接ThinkPHP都会进行escape_string处理
注意: mysql_escape_string() 并不转义 % 和 _。 本函数和 mysql_real_escape_string() 完全一样,除了 mysql_real_escape_string() 接受的是一个连接句柄并根据当前字符集转移字符串之外。mysql_escape_string() 并不接受连接参数,也不管当前字符集设定。
mysql_escape_string() 的作用和addslashes的作用差不多
分析find()函数
find()-->parseOptions()-->select()最后才创建buildselectsql() 函数。
1、 接着进入到options()中 主要作用就是获取操作的表名,查看是否有取别名获取操作的模型,比对当前表的数据库字段是否一致,如果有不一致的字段$this->options
parseType() 功能是对数据类型进行检测 并强制转换.
select()
执行 $this->db->select( options)
buildSelectSql()
db-select()->buildSelectSql() 分页操作,最后直接执行pareSql(). parseSql函数 函数调用了str_replace()对sql语句做了一次安全检查
pareSql() ->parseTable()
parseWhere()方法分析,,这里进行拼接字符串,parseKey()过滤,然后返回
parWhereItem()函数 ,这里是个重点接下来两个漏洞利用都与这有关系
parseValue() -->用来判断传进来的是数组还是字符串。然后根据不同调用escapeString()
方法。
最后生成sql语句
0x03 总结分析
分析完之后能看到 在parWhereItem()函数里 明显就有两个漏洞生成。后面的文章会先对这两个漏洞进行分析。
0x0a、漏洞利用 (GET传参,exp注入)
前面那篇文章,我们在parseWhereItem()函数 里看到两个漏洞,接下来就直接进行分析了。
利用的exp
```
id[0]=exp&id[1]=='1' and updatexml(1,concat(0x3a,user(),0x3a),1)--+
```
控制器代码
关于M函数和where函数都分析过了,现在也不在这里过多的赘述。where()->select()->db-select()->buildSelectSql()
分析where()函数--对parseWhereItem函数进行分析
最关键的是:
```
elseif('exp' == $exp ){ // 使用表达式
$whereStr .= $key.' '.$val[1];
```
直接拼接了sql语句 。直接导致sql注入成功
生成的sql语句 拿到数据库去执行一下
0x0c、漏洞修复
因为前面的id值是通过GET传值,没有做任何的过滤。现在使用I()接受id传值 ,然后 接收到传值之后I函数会做一次过滤
看一下拼接的sql语句
直接防住了 exp传值。
分析一下:I()函数会直接运行到think_filter()函数
关于数据库的第二个漏洞,属于同一种类型,不多bb直接写了
靶机描述 'hackme2' is a medium difficulty level box. This is the second part of the hackme series where more controls are in place do …
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论