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 // /!/