sql注入系统学习
sql注入系统学习
寻找及确认sql注入
于参数后面加一个单引号’
and于or
加法和减法
数字型不需要单引号时 |
利用sql注入
识别数据库
asp和.net Microsoft SQL Server |
基于错误识别数据库
需要一条详细的报错信息 |
基于数字函数推断
数据库服务器 | 函数 |
---|---|
Mircrosoft SQL Server | @@pack_received.@@rowcount |
Mysql | connection_id().last_insert_id().row_count().len() |
Oracle | BITAND(1,1).length() |
postgreSQL | select EXTRACT(DOW FROM NOW()) |
connection_id()不管值多少都是正的也就是真的,last_insert_id()这里不存在insert语句,默认情况就是返回零,也就是假.
那么如果and connection_id()数据返回正常,and last_insert_id()不返回数据我们就可以推断这个是一个mysql数据库了
UNION语句提取数据
UNION语句可以合并两条或多条SELECT语句的查询结果,如果应用返回了第一条查询语句的数据,我们就可以在第一条查询语句后面注入一个UNION运算符添加一个任意查询,来提取数据,但是必须满足两个条件
两个查询返回的列数必须相同
可以使用NULL来尝试,由于NULL值会转成任何数据类型
union select null,null,null... 这样加上去知道不返回错误
order by 4两个查询语句对于列返回的数据类型必须相同
使用我们的测试字符串进行替换null
union select user(),@@version,null
枚举数据库
表,列,数据存放在information_schema数据库中
数据库名存放在information_schema数据库下的schemata表的schema_name字段中 |
窃取哈希口令
mysql在mysql.user表中存储哈希口令
select user,password from mysql.user |
获取webshell
利用sql注入像服务器写文件(这里需要得到网站的绝对路径)
select into outfile(dumpfile)//mysql 写文件命令 |
sql盲注
1.提交一个导致sql查询无效时,会返回一个通用错误页面,提交正确则会返回一个内容可被适度控制的页面 |
基于布尔
SUBSTRING(str,pos,len) |
1 and SUBSTRING(user(),1,1)='a' 看返回true还是false |
基于时间
union select if(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null |
绕开过滤
大小写变种
如使用strstr($id,'union') strstr()函数是对大小写敏感的,所以可以大小写绕过 |
URL编码
对数据进行url编码 |
双url编码,但是前提是后面有一个url解码
sql注释
当仅使用strstr($id,’ ‘)过滤空格时,可以使用注释符等绕过
空字符
通常的输入过滤器都是在应用程序之外的代码实现的。比如入侵检测系统(IDS),这些系统一般是由原生编程语言开发而成,比如C++,为什么空字节能起作用呢,就是因为在原生变成语言中,根据字符串起始位置到第一个出现空字节的位置来确定字符串长度。所以说空字节就有效的终止了字符串。
只需要在过滤器阻止的字符串前面提供一个采用URL编码的空字节即可,例如:
%00' union select username,password from users where username='admin' -- |
二次SQL注入
查询的语句所用到的变量name就是从数据库提取到的我们的用户名,所以我们可以先利用更新我们的用户名功能插入语句进数据库。
评论
ValineDisqus