1.Thinkphp框架 < 5.0.16 sql注入漏洞分析
2.文件包含漏洞相关知识总结
3.thinkphp 3.2.3 exp注入漏洞分析
4.「原创」萌新也能看懂的入漏ThinkPHP3.2.3漏洞分析
5.记一次艰难的SQL注入(过安全狗)
Thinkphp框架 < 5.0.16 sql注入漏洞分析
分析ThinkPHP框架 < 5.0. 的SQL注入漏洞,作者在i春秋论坛和先知社区分享了发现和修复过程。洞源首先,入漏通过PHPstudy环境搭建,洞源使用ThinkPHP的入漏input()函数接收数据,并利用框架的洞源查看js源码方法数据库操作功能。漏洞复现时,入漏通过payload访问程序,洞源逐步追踪到SQL执行的入漏代码路径。
在\thinkphp\library\think\db\Query.php中,洞源`parseTable`函数对传入的入漏数组进行处理。然而,洞源当数组的入漏第一个元素为'inc'时,函数并未进行安全检查,洞源导致SQL注入。入漏示例中的数组被拼接进SQL语句后执行,成功引发了错误,表明攻击成功。
对于为何设置特定数组格式,是为了在后续的代码中组合数据。`parseData`函数的执行显示了这个过程。对于不熟悉ThinkPHP的读者,作者建议先了解框架结构,对于PHP代码不清楚的部分,可以复习PHP基础知识。
漏洞分析的参考资源包括ThinkPHP官方文档和相关文章。通过这个分析,开发者可以了解漏洞产生的过年高源码原因,并采取措施修复,提高应用的安全性。
文件包含漏洞相关知识总结
文件包含漏洞概念:通过PHP函数引入文件时,若文件名未经过合理验证,可能导致操作未预期的文件,甚至发生意外文件泄漏或恶意代码注入。
文件包含漏洞的环境要求:允许远程服务器或网站检索数据的配置allow_url_fopen必须为On状态,而allow_url_include则在php5.2之后默认为Off状态。
常见文件包含函数:include与require的区别在于,include在文件不存在时会产生警告但脚本继续执行,而require则会引发致命错误并停止脚本。
文件包含漏洞的利用方法:通过php://input或data://伪协议注入代码,以及利用file://、zip://、compress.zlib://、bzip2://、phar://和php://filter获取或执行文件内容。这些方法可以结合文件上传漏洞进行利用。
文件包含漏洞的截断:利用%截断或路径长度截断,前者针对php版本低于5.3.4且magic_quotes_gpc为off状态的场景,后者则适用于php版本低于5.2.8的情况。
包含Apache日志文件:通过构造请求,将PHP代码插入到日志文件中,借助文件包含漏洞执行日志中的PHP代码,获取用户访问记录信息。
包含SSH log日志:通过ssh连接并输入密码后,结合文件包含漏洞,version劫持源码可以访问并利用SSH日志文件。
包含SESSION:通过获取Session内的可控变量,如phpsessid,利用可读写的Session文件,实现对session内容的访问。
包含environ:在php以cgi方式运行时,environ会保留UA头信息。通过插入PHP代码到environ文件中,再利用文件包含漏洞执行代码。
包含/proc/self/fd/[environreferer]:利用burpsuite的测试器模块fuzz方法,挖掘并利用/proc/self/fd目录下的文件结构,包含SSH log日志。
包含临时文件:通过上传文件创建的临时文件,利用文件包含漏洞在文件被删除前访问。可以通过暴力猜测文件名或利用PHPinfo页面获取上传文件的存储路径和临时文件名。
文件包含漏洞的绕过方法:特定前缀绕过,如目录遍历和编码绕过,以及指定后缀绕过,利用url编码、二次编码等技巧实现绕过。
thinkphp 3.2.3 exp注入漏洞分析
在官网下载thinkphp3.2.3,配置MySQL账号密码于Convention.php文件,添加一行用于打印SQL语句。漏洞代码通过特定的HTTP请求触发,如:http://.0.0.1/index.php?id[0]=exp&id[1]==1 or sleep(5)。通过断点调试,跟踪至Model类的网络源码商城select函数,进而深入至其内部处理逻辑,发现$exp的值即为传入的exp,该值被直接拼接到后续SQL语句中,形成SQL注入。
使用I函数可以防止注入攻击,原因在于ThinkPHP\Common\functions.ph中的think_filter函数会将特殊关键字(如EXP、OR等)加上空格,避免进入if语句进行SQL字符拼接。
对于普通的SQL注入,thinkphp3.2.3会通过解析数据库字段类型来防止注入。在Model类的_parseType()函数中,对于字段类型为int()的字段,会将传入的值转化为整数类型,使得注入语句失效。对于字符型注入,系统在Think\Db\Driver.class.php中的escapeString()函数中对特殊符号进行转义,实现防御。
除了exp注入,还有bind注入方法。bind注入通过在SQL语句中插入特殊符号,导致SQL错误进行攻击。虽然实现较为复杂,但由于think_filter函数未对bind进行过滤,因此即使使用了I函数获取参数,仍有可能实现bind注入。
针对此漏洞的修复策略包括:1. 尽量在应用中使用I函数获取用户输入的参数;2. 修复代码,将安全补丁整合到index.php入口文件中,cdk系统源码确保应用从源头开始执行安全措施。
「原创」萌新也能看懂的ThinkPHP3.2.3漏洞分析
ThinkPHP是一个高效、兼容且简单的轻量级PHP开发框架,支持Windows/Unix/Linux服务器环境,正式版本要求PHP5.0或更高版本,并兼容MySql、PgSQL、Sqlite多种数据库以及PDO扩展。
佳哥在i 春秋论坛分享了自己学习ThinkPHP3.2.3漏洞分析过程的完整记录,内容适合初学者,未经许可,严禁转载。
本文将详细解析ThinkPHP3.2.3中的几个常见漏洞:where注入、exp注入、bind注入、find/select/delete注入、order by注入和缓存漏洞。
在控制器中使用字符串方式作为where参数时,存在where注入漏洞。通过在变量user处设置断点并使用PHPSTROM F7进入,可以看到I方法获取了传入的参数。重点在于过滤函数,首先使用htmlspecialchars过滤参数,然后利用think_filter过滤常规SQL函数。在where方法中,将$where的值放入到$options["where"]数组中。继续跟进查看find方法,最终生成完整SQL语句。关键在于parseWhere方法的执行,进而解析出具体的注入payload。
exp注入漏洞中,使用全局数组进行传参,可以激活漏洞。直接在$user处设置断点,F7跟进,跳过where方法,继续跟进find、select、buildSelectSql、parseSql和parseWhere方法。在跟进parseWhereItem方法时,参数$val为数组形式,{ ‘exp’,‘sql注入exp’}。此时,当$exp满足exp时,参数与值进行拼接,最终payload为sql注入exp。
bind注入漏洞中,使用save方法进行演示。生成SQL语句在update方法中,在parseSet方法中,传入的参数被替换成:0。在bindParam方法中,将参数值包裹在冒号(:)中。继续跟进parseWhere和parseWhereItem方法,当exp为bind时,参数值前面会加上冒号(:)。由于SQL语句中已有冒号,因此在excute方法中,:0被替换成了第二个参数的值,最终payload为。
find注入中,当传入id[where]=1p时,导致不能执行_parseType方法转化数据。继续跟进select、buildSelectSql、parseSql和parseWhere方法,传入的$where为字符串,直接执行了if语句。当传入id=1p时,无法执行注入,原因在于find、_parseOptions、_parseType方法将传入的参数强转化为整形。
select和delete注入的原理与find方法相似,但delete方法多了一个判断是否为空的步骤。
order by注入漏洞中,首先在控制器中编写漏洞演示代码。在user变量处设置断点,F7跟进find、select、buildSelectSql和parseSql方法。当$options['order']参数不为数组时,直接返回order by + 注入payload,最终payload为。
缓存漏洞中,ThinkPHP3.2提供F方法和S方法用于缓存操作。S方法通过set方法写入缓存,然后使用filename方法获取写入文件的路径,保存在../Application/Runtime/Temp目录下。最后,将S传入的name进行md5值作为文件名,通过file_put_contents函数将内容写入文件。
总结,本文详细解析了ThinkPHP3.2.3的几个重要漏洞,并提供了具体的实现步骤和payload示例。为了确保安全,开发者应仔细审查代码,确保参数安全过滤,并在开发过程中遵循最佳实践。实际操作中,尝试复现这些漏洞,并在安全环境中进行验证,可以加深对ThinkPHP框架及其安全性的理解。
记一次艰难的SQL注入(过安全狗)
最近在挖掘补天的src,发现了多个SQL注入漏洞,我尝试着利用这些漏洞获取敏感信息。在挖掘过程中,我遇到了一个使用了PHP魔术函数过滤单引号的注入点。我决定不放弃,决心突破这个限制。
我首先尝试使用常规方法进行注入测试,但发现单引号被自动转义。接着,我尝试通过在单引号前添加汉字双字节编码来绕过这个限制。构造的Payload成功过滤了单引号,但程序报错,提示我需要利用爆错注入技术。
为了获取数据库信息,我构造了一系列Payload。通过Payload成功注出数据库名、版本以及当前用户信息。接着,我尝试获取表名,利用内联注释绕过安全狗的限制,最终成功获取了管理员表和表中的列名。
在获取表名后,我遇到一个难题:如何绕过安全狗对select语句的限制。通过阅读相关文章,我了解到可以使用 ` /*!%elect*/` 替代 `select` 实现绕过。这种方法成功帮助我获取了列名,我进一步测试了其他关键词,也实现了绕过。
获取列名后,我利用`substr`函数分两次爆出了账号密码,最终成功登录后台。整个过程中,我深刻体会到了实战注入的难度和挑战性,以及在面对限制时选择性放弃和尝试其他方法的重要性。
实战过程中,绕过限制、寻找漏洞、爆密等操作需要丰富的经验和技巧,同时也需要不断学习新方法,灵活应对。在这个过程中,学会利用搜索工具和选择性放弃同样至关重要。当一条路行不通时,不妨换一种方法,也许就能找到解决问题的途径。实践证明,通过不断尝试和学习,可以克服种种困难,实现突破。