SQL注入(1)

1.数字型注入

例如PHP代码

" Select username from users where id=".$_GET['id']

可以注意到,用户的输入ID字段没有任何过滤的,被直接拼接在了SQL查询语句中,由于ID没有被引号包裹,而且类型为数字,我们称这种注入为数字型注入

我们可以使用在语句中加入运算符的方法来测试这种注入是否存在,比如测试id=1和id=2-1,如果两者都查询到了且结果相同,说明PHP文件将2-1作为一个表达式执行,如果这种情况,说明有可能是一个数字型SQL注入,此时只能得到用户名,想要更多的信息,需要使用一个SQL关键字union

2.Union注入

Union可以将两个select语句的结果合并到一个结果集中,但是要求两个select语句拥有相同的列数

例如输入id=0 union select password from users,(空格的URL编码为%20)

表示从users表中读password列(在打出这个例子是已知有users表和password列)

在这里写ID=0列,是因为要使第一个select结果为空,让第二个select语句查询的password显示出来,还可以用limit关键字查询其他行

3.字符型注入

" Select id from users where username=' ".$_GET['username']." ' ''

用户输入username被单引号包裹了起来,这样一来用户的所有输入都会被当做字符串处理,无法使用之前数字型注入的payload进行注入了。但是如果我们的输入中也存在一个引号,这样就可以将前面的引号闭合,使得后面的内容从字符串中逃逸出来,最后还需要将后面的引号注释掉,以免引发语法错误

比如我们可以使用一个单引号,将字符串闭合,最后用井号将后面的单引号注释掉

例如username='or1=1#(单引号,空格,井号都需要URL编码)

在where语句中,or连接两个表达式,第一个返回假,第二个返回真,or操作后返回真,整个操作返回所有的结果集

4.布尔盲注

当服务器不显示查询结果,只返回是否查询成功时,我们就无法使用union直接回显数据,这时就需要进行盲注,这里先操作布尔盲注

既然只返回两种状态,存在或不存在,就可以通过这两种状态注入出数据

Username='or substr (password ,1,1)='1'#

Substr是一个字符串截取函数,第一个参数是要截取的字符串,第二个是截取开始的位置,第三个是截取长度,例如上面语句的意思是从第一个字符开始截取password字段的一个字符,并判断等不等于1,这个数字自己一个一个尝试太麻烦,可通过爆破来进行,直到达到某一位,我们无法遍历出其真正的值时,就意味着我们可能已经猜测完成,也可以提前使用length函数猜测一下这个字符串的长度

相关推荐
走在路上的菜鸟几秒前
Android学Dart学习笔记第二十五节 类修饰符
android·笔记·学习·flutter
polarislove02145 分钟前
8.2 时钟树编程-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
阑梦清川5 分钟前
26考研408计算机网络真题---非官方解析
计算机网络·考研
世界尽头与你16 分钟前
CVE-2021-40438_ Apache HTTP Server mod_proxy 模块 SSRF漏洞
安全·网络安全·渗透测试·apache
wanderful_17 分钟前
Javascript笔记分享-流程控制(超级超级详细!!!)
javascript·笔记·流程控制·实战案例·新手友好
ghgxm52019 分钟前
EXCEL使用VBA代码实现按条件查询数据库--简单实用
开发语言·数据仓库·笔记·excel·数据库开发
Hello.Reader20 分钟前
Flink SQL 新特性Materialized Table 一文讲透(数据新鲜度驱动的自动刷新管道)
java·sql·flink
张人玉21 分钟前
C# WPF 折线图制作笔记(LiveCharts 库)
笔记·c#·wpf·折线图·linechart
我想我不够好。22 分钟前
低压实操 12.22
学习
知识分享小能手27 分钟前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 的 Vim 编辑器 —— 全面详解(含基础操作、高级技巧与编程实践)(5)
linux·学习·ubuntu