拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Web渗透之联合查询注入全流程

本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行任何未经授权使用文中技术的行为均与作者无关请务必遵守法律法规获得许可后方可进行渗透测试。目录一、概念1.SQL注入的概念2.SQL注入的目的二、注入点的数据类型1、注释2、注入步骤(1) 方式一原理(2) 方式二原理(3)方式三三、确定字段数四、sql注入五、确定回显字段六、sql注入七、查询数据库的信息数据库函数sql注入八、查询数据库中所有的表九、查询某张表中所有的列十、查询某张表中所有表数据十一、防御和绕过1、对特殊符号进行转义2、强转整数3、替换关键字大小写绕过双写绕过注释绕过一、概念1.SQL注入的概念SQL注入是一种常见的网络安全漏洞指攻击者通过在Web表单输入、URL参数或请求头等用户可控的位置恶意插入SQL代码片段从而欺骗后端数据库执行非预期的SQL命令。核心原理当应用程序动态构造SQL查询语句且未对用户输入进行充分过滤或参数化时攻击者可以改变原SQL语句的逻辑结构。例如将登录验证的SQLSELECT * FROM users WHERE name 输入的用户名 AND pwd 输入的密码通过输入admin --恒真条件并注释后续语句变成SELECT * FROM users WHERE name admin -- AND pwd xxx从而无需正确密码即可绕过认证。2.SQL注入的目的SQL注入攻击的主要目的通常分为以下几类攻击者根据自身意图选择不同的利用方式绕过认证机制在登录、权限校验等场景中通过注入恒真条件如 OR 11或注释掉后续密码检查无需有效凭证即可冒充其他用户尤其是管理员。获取敏感数据数据泄露窃取用户表账号、密码可能哈希、个人身份信息、支付信息提取业务数据订单、交易记录、内部文档联合查询获取数据库元数据如所有表名、字段结构为后续攻击铺路篡改数据利用UPDATE、INSERT、DELETE语句修改数据库内容例如提升自身权限等级篡改商品价格、投票结果删除日志以掩盖入侵痕迹拒绝服务或破坏数据批量删除表或行如DROP TABLE或DELETE执行耗时查询笛卡尔积、递归调用耗尽数据库资源提权与命令执行在特定数据库如MySQL的INTO OUTFILE中写入Webshell获取服务器控制权利用存储过程或函数执行操作系统命令如xp_cmdshell持久化隐蔽后门通过UNION或时间盲注等技术长期从数据库中批量外发数据到攻击者控制的服务器。简单总结核心目的就是“让数据库执行原本不被允许的操作”最终实现信息窃取、身份冒用、权限提升或破坏系统。防御上需以参数化查询为根本并配合权限最小化原则。二、注入点的数据类型数字型Integer/Float特征SQL中直接拼接数字无需引号包围。示例SELECT * FROM products WHERE id 1→ 注入id1 OR 11测试输入1 AND 11与1 AND 12看响应差异。字符型String特征使用单引号或双引号包围用户输入。示例SELECT * FROM users WHERE name admin→ 注入admin OR 11需闭合或注释掉多余的引号。搜索型LIKE 查询特征与LIKE操作符组合通常带有%通配符。示例SELECT * FROM articles WHERE title LIKE %{keyword}%→ 注入% OR 11 --需处理通配符及引号。JSON/XML 字段特征数据库支持JSON/XML类型应用程序可能直接拼接查询路径。示例MySQL中SELECT />发现页面报错再加-- -发现不报错所以判断是字符型原理让我们看一下这个靶场的源代码可以看到这个id有单引号包裹所以这个靶场是字符型注入如果我们加了个单引号这个语法是错误的所以会报错如果加个-- - 语法正确回显正常(2) 方式二在url中输入 and 11,页面的结果不发生变化,再输入 and 12,页面的结果发生变化,可以确定注入点数据类型为数字型,反之就是字符型输入11页面不发生变化输入12页面还是不发生变化判断是字符型原理11回显正常自动取前面的1后面的丢弃12还是不变但是数字型11是回显正常12就找不到了字符型无论后面写什么它都会把后面的自动丢弃(3)方式三在url输入转义符通过观察页面的报错情况来判断注入的数据类型可以看到把最外面引号去掉之后里面的1\由引号包裹所以判断是字符型如果没有引号包裹那就是数字型三、确定字段数order by 1 表示根据字段1进行排序可以查出来数据表字段1里的数据如果写2 就是第二个字段进行排序同理写3也能查出来但是写4就会发生报错如果报错就说明它没有第四个字段所以我们就判断只有三个字段四、sql注入如果是数字型那就直接写order by 1 -- -如果是字符型需要按下图格式去写正确语法’ order by 1 -- -已知这道题是字符型加入单引号界面会报错所以要再加-- - 界面恢复正常ok我们再添加order by 1运行发现没报错可知字段一存在添加2发现都没报错可知存在2字段但是添加3发现报错可知只存在12字段3字段不存在五、确定回显字段确定回显字段的sql语句六、sql注入使用union进行联合查询注入 ​ union的作用就是把左边sql语句查出来的数据与右边sql语句查出来的数据进行合并 ​ 要注意左右列数一致数据要兼容使用limit进行分页查询 ​ limit 索引行数 ​ 对limit来说第一行的索引是0第二行的索引是1注入的时候limit可以不写前面1前可以加个负号效果是一样的七、查询数据库的信息数据库函数以下是MySQL 中常用于信息收集的内置函数/变量列表可在 SQL 注入中用于探测数据库环境最常用的是前三个函数/变量作用返回值示例database()当前使用的数据库名securityversion()MySQL 版本号5.7.42user()当前连接用户及主机rootlocalhostcurrent_user()当前被认证的用户通常与user()相同rootlocalhostsystem_user()系统用户MySQL 服务运行的操作系统用户mysqlsession_user()当前会话用户rootlocalhostversion同version()5.7.42-logversion_commentMySQL 版本附加信息Source distributiondatadir数据目录路径/var/lib/mysql/basedirMySQL 安装基目录/usr/hostname服务器主机名localhost.localdomainportMySQL 服务端口3306tmpdir临时目录路径/tmpsecure_file_priv文件导入/导出限制目录NULL或具体路径log_error错误日志文件路径/var/log/mysql/error.logschema()同database()securitysql注入查询数据库的名称查询数据库的版本号查询当前登录数据库的账号可以进行联合查询数据库的基本信息示例八、查询数据库中所有的表sql语句这种sql语句还不能进行sql注入我们得把它转成单行单列的用group_concat()把值转换成一行这样就能进行sql注入了查询的时候我们得用子查询把它放进小括号里这样表名就出来了演示效果九、查询某张表中所有的列查询某张表中的列的sql语句sql注入咱们查users表下的列试一试http://192.168.179.135/DVWA-master/DVWA-master/vulnerabilities/sqli/?id1 union select (select group_concat(column_name)from information_schema.columns where table_schemadatabase() and table_nameusers),2 limit 1,1-- -SubmitSubmit#十、查询某张表中所有表数据sql语句先多列转一列再多行转一行这样就能sql注入了示例http://192.168.179.135/DVWA-master/DVWA-master/vulnerabilities/sqli/?id1 union select (select group_concat(concat_ws(-,avatar,failed_login,first_name,last_login,last_name,password,user,user_id)) from users),2 limit 1,1-- -SubmitSubmit#十一、防御和绕过1、对特殊符号进行转义或访问文件首先他是字符型的给它注释掉可以看到多了个斜杠这个斜杠是转义符对于数字型可以把userinfo转换为十六进制转换完之后sql语句就长这样子可以绕过转义结论转义对字符型注入点有效但对数字型注入点无效 ​ 绕过如果注入点是数字型可以使用十六进制绕过2、强转整数强转整数只能进行数字型防御3、替换关键字大小写绕过select没了这就是替换关键字但是换成SELECT就可以绕过这样可以写这样的话SELECT就无法绕过了双写绕过但是我们可以双写绕过注释绕过我们也可以替换空格空格就没了我们也可以使用/**/注释代替空格
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门