做公司网站要注意哪些问题,经典软文案例200字,妹妹强迫我和她做网站,uiapp界面设计模板sql注入实战——thinkPHP sql注入实战——thinkPHPthinkPHP前期环境搭建创建数据库开始寻找漏洞点输入SQL注入语句漏洞分析 实验错误 sql注入实战——thinkPHP
thinkPHP前期环境搭建
下载thinkPHP文件 解压#xff0c;将framework关键文件放到think-5.0.15中#xff0c;改… sql注入实战——thinkPHP sql注入实战——thinkPHPthinkPHP前期环境搭建创建数据库开始寻找漏洞点输入SQL注入语句漏洞分析 实验错误 sql注入实战——thinkPHP
thinkPHP前期环境搭建
下载thinkPHP文件 解压将framework关键文件放到think-5.0.15中改名为thinkphp 再将think-5.0.15放到WWW文件夹中
输入localhost/WWW/think-5.0.15/public/index.php访问应用入口文件 搭建完成
创建数据库
登入mysql 创建数据库
修改数据库连接文件 \phpstudy_pro\WWW\think-5.0.15\application\database.php 编写控制器——编写一个get传参传参uesrname默认值为a 将上面get传参获得的username插入到数据库users里面
db(users)-insert([username $username]);开始寻找漏洞点
输入SQL注入语句
http://localhost/think-5.0.15/public/index.php?username[0]incusername[1]updatexml(1,concat(0x7e,user(),0x7e),1)username[2]1 注入成功
漏洞分析
官方发布的5.0.16版本更新说明中发现其中提到了该版本修复了一个漏洞 查阅commit记录发现其修改的Builder.php文件代码比较可疑 从官网的更新日记中可以看到绿色为新添加补丁漏洞大概率出于此处 接着我们直接跟着上面的攻击payload看看漏洞原理。首先payload数据经过thinkphp内置方法的过滤后直接进入了$thik-builder的insert方法所以从insert函数开始
断点下到insert语句可以看到username传参1个数组分别是我们输入的三个变量
username[0]incusername[1]updatexml(1,concat(0x7e,user(),0x7e),1)username[2]1
之后走到db类中的insert方法 这是数据库的连接跳出来到insert函数
此处的$data中一个数组三个变量即
username[0]incusername[1]updatexml(1,concat(0x7e,user(),0x7e),1)username[2]1
来到sql语句传递dataoptionsreplace三个传参 data一个数组三个变量同上 options表名table“users”
进入builder的insert方法中 而 Mysql类继承于 Buider 类即上面的this-builder-insert()最终调用的是 Builder 类的 insert方法。在 insert 方法中我们看到其调用 parseData方法来分析并处理数据而 parseData方法直接将来自用户的数据val[1]进行了拼接返回。我们的恶意数据存储在val[1]中虽经过了 parseKey 方法处理当丝毫不受影响因为该方法只是用来解析处理数据的并不是清洗数据。
进入parseData
data [usernamearray(3)] key “username” val array(3)
array(0)“inc”array(1)“updatexml(1,concat(0x7e,user(),0x7e),1)”array(2)“1”
往下滑找到补丁处 从上面可以看到直接将用户数据进行拼接然后再回到Builder类的insert方法直接通过替换字符串的方式将data填充到sql语句中造成sql注入漏洞
break跳出得到result
退出insert函数
keys和values的处理
最后进行sql的拼接其中values等于我们的报错注入语句所以漏洞出现完成sql注入
实验错误
找不到用户 原因新建的数据库内没有创建表和用户
创建表users里面有两列username和password
查看表格和内部结构
向表内插入用户
查看表内用户数据
创建用户成功 成功报错