前言
首先如果想深度的学习这个靶场,不太建议使用 kali 来做 sqli-labs,这是个很老的靶场,php 版本要5.5以下,甚至更低,很多函数都废弃了。
不过使用 kali 主要是因为它环境很全,不至于在主机上下载很多东西,但现在的 kali 很多软件的版本都很高,不太兼容 sqli-labs,即使是网上大神修改了一部分制作出 kali 版本的,但在我个人的 kali 里运行起来仍然不顺利。
(不知道在其他人的电脑上是不是这样)
我是使用的 kali,我懒,我也不想把主机搞得乱糟糟的。
下载链接
我的环境
- Linux kali 6.6.9-amd64
- php 8.1(自带)
- burpsuite 社区版(自带)
安装
总过程
# 启动 apache 服务,可以打开 htttp://127.0.0.1
sudo service apache2 start
# 开启 mysql 服务
sudo service mysql start
mysql -uroot -p
# 初始密码为空,回车进入
# 修改密码
MariaDB [(none)]> SET password for 'root'@'localhost'=password('你自己的密码');
# 安装sqli-labs
# 通常 /var/www/html 是 Web 服务器的默认根目录
cd /var/www/html
git clone https://github.com/mukkul007/sqli-labs-kali2 sqli-labs
#
# 修改凭证信息,填写密码
cd sqli-labs/sql-connections/
nano db-creds.inc
# 自动创建数据库
# 1.访问 http://127.0.0.1/sqli-labs/,点击第一个链接
# 2.或执行下面命令
php setup-db.php
# sql 命令
sudo -uroot
show databases;
use GRG56NF4AA;
show tables;
select * from GRG56NF4AA;
需要在 /var/www/html/
文件夹下 git clone,因为 apache 启动后可直接通过 http://localhost/
访问这个文件夹
问题
函数问题
-
废弃的
get_magic_quotes_gpc() // 7.4.0 废弃 mysql_escape_string() // 4.3.0 mysql_real_escape_string() // 5.5.0 -> 直接删掉它吧,我也没找到可以代替它的函数 mysql_query() // 5.5.0 -> mysqli_query mysql_error() // 5.5.0 -> mysqli_error mysql_connect() // 5.5.0 -> mysqli_connect mysql_select_db() // 5.5.0 -> mysqli_select_db mysql_fetch_row() // 5.5.0 -> mysqli_fetch_row mysql_fetch_array() // 5.5.0 -> mysqli_fetch_array mysql_affected_rows() // 5.5.0 -> mysqli_affected_rows
-
可使用的
empty() intval() substr() stripslashes() addslashes(); // ' " \ null 前添加转义字符 ctype_digit() // 8.1.0 $con1 = mysqli_connect($host, $dbuser, $dbpass, $dbname); mysqli_multi_query($con1, $sql) $result = mysqli_store_result($con1) $row = mysqli_fetch_row($result) $row[0] $row[1] $row[2] $row = mysqli_fetch_assoc($result)) $row['id']; $row['username']; $row['password']; $unames = array("Dumb","Angelina","Dummy","secure"); $pass = array_reverse($unames); $unames[$row['id']] $pass[$row['id']] mysqli_free_result($result); mysqli_next_result($con1) mysqli_more_results($con1) mysqli_select_db($con1, $dbname) mysqli_connect_error() // 无参 mysqli_connect_errno() // 无参
-
我们需要对函数做些修改
有些废弃的函数需要修改成新版的函数,要考虑是否修改传参,修改传参数量
比如:有些需要加
$con
,有些需要删除
权限问题
-
sqli-labs 文件夹
# 使用 git clone 后,sqli-labs 文件夹的权限有可能属于 root ls -l # drwxr-xr-x 1 root root 1798 Feb 15 09:44 sqli-labs # 可能需要修改它的权限(按需修改) sudo chown kali:kali /sqli-labs -R ls -l # drwxr-xr-x 1 kali kali 1798 Feb 15 09:44 sqli-labs
-
result.txt 文件
# 出现以下错误,说明 result.txt 文件可能不能读写 Error opening file: fopen(result.txt): Failed to open stream: Permission denied # 如果没有输出错误,可以添加以下代码试试看 $fp=fopen('result.txt','a'); if (!$fp) { $error = error_get_last(); die('Error opening file: ' . $error['message']); } ls -l # -rwxrw-rw- 1 kali kali 470 Feb 18 02:40 result.txt # 解决:添加权限,766 应该也可以 sudo chmod +777 result.txt # 对于其他的,直接复制一份这个有权限的 result.txt 到其他文件夹下就行
错误信息显示不了的
- 添加
<font>
标签// 有的时候参数正确,但还是不显示任何信息,可以添加这个标签 echo '<font color= "#FFFFFF">'; ... echo "</font>";
mysqli_error
的函数有问题(未直接解决)
建议是可以添加一条语句,把之前的 sql 语句输出来(如果不能输出,添加一下 font 标签),然后在navicat 里输入,看能不能运行出来,如果运行成功,那就没有问题。尤其是在进行报错注入时。... $id = '"'.$id.'"'; $sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1"; // echo $sql; // 自己添加 $result = mysqli_query($con, $sql); $row = mysqli_fetch_array($result, MYSQLI_BOTH); if($row) { echo '<font size="5" color="#FFFF00">'; echo 'You are in...........'; echo "<br></font>"; } else { echo '<font size="3" color= "#FFFF00">'; print_r(mysqli_error($con)); // 不知道为什么不输出 // echo mysqli_error($con); // 没用 // print_r(mysqli_error()); // 没用 echo "</br></font>"; } ... MySQLi 错误相关函数: mysqli_error() mysqli_errno() mysqli_error_list() mysqli_connect_error() mysqli_connect_errno()
- 修改 php.ini 配置文件(不一定可以,很奇怪的是,错误时有输出)
# 修改 php.ini 配置文件 cd /etc/php/<version>/apache2/php.ini sudo su gedit php.ini # display_errors = On # error_reporting = E_ALL # 重启服务 service apache2 restart
远程连接
-
选择终端远程连接数据库
但首先,kali 默认禁用了 root 用户使用 ssh 登录,需要打开 ssh 授权
# 我也不知道哪几条命令有用 # 登录 ssh kali@192.168.133.132 # 重启ssh /etc/init.d/ssh restart systemctl restart ssh # 状态 systemctl status ssh service ssh status # 开机自启 systemctl enable ssh # 更新防火墙规则 加入 22 port(端口),使用root身份更新并重启ssh服务,临时生效 $ iptables -I INPUT -p tcp --dport 22 -j ACCEPT $ systemctl restart ssh
远程连接
# 远程终端连接 mysql -uroot -p000000 -P3306 -h 192.168.133.132
-
navicat 连接
在使用 navicat 连接 kali 数据库时有问题的
2002 - Can't connect to server on 192.168.133.132'(10061) # 这个错误和 navicat 没有关系,就是用 CMD 登录 MySQL 也会报 10061 错误,是 MySQL配置的问题 # 登录账号远程访问权限问题 # SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''' ;') AS query FROM mysql.user; # MySQL 配置文件设置问题 # 修改值设置为 0.0.0.0 nano /etc/mysql/mariadbconf.d/58-server.cnf bind-address = 0.0.0.0 # 重启服务 service mysql restart
1045 - Access denied for user 'root'@'192.168.133.1' (using password: NO) # 有可能密码错误
2003 - Can't connect to MySQL server on 192.168.133.132' (10038) # linux 没有关闭防火墙 service iptables stop # 或 chkconfig iptables off systemctl stop firewall # 临时关闭防火墙 systemctl disable firewall # 永久关闭防火墙
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements -- 与验证密码策略 validate_password_policy 的值有关。 -- 默认是1,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。 -- 如果不想设置8位,或者想设置简单点,可以选择Policy=0 -- 修改 validate_password_policy 参数的值(等级为0) set global validate_password_policy=0; -- 设置简单密码 alter user 'root'@'localhost' identified by '123456';
sql 相关
这个不算太重要,最好不要自己设置,或者跟着网上教程设置,因为设置错误后,修改起来好麻烦
# kali 自带的有一个数据库,需要要先初始化才能用(这句话也不一定正确)
# service mysql start
mysql_secure_installation
# 引导完成一些基本的安全设置,包括删除匿名用户、禁止远程root登录、删除测试数据库等
-- 当前密码安全策略
select @@validate_password_policy;
-- 查看具体的设置项
SHOW VARIABLES LIKE 'validate_password%';
最后
补点知识
mysql 数据库 5.0 以上版本有一个自带的数据库 information_schema
,该数据库下面有两个表 tables 和 columns
tables 表
table_name
字段下面是所有数据库存在的表名
table_schema
字段下是所有表名对应的数据库名
columns 表
colum_name
字段下是所有数据库存在的字段名
columns_schema
字段下是所有表名对应的数据库
MariaDB 和 MySQL
MariaDB 的创始人之一、挪威开发者 Michael “Monty” Widenius 因对 Oracle 收购 Sun Microsystems(MySQL 的原所有者)的不满而创建了 MariaDB。
MariaDB 的目标是提供一个自由、开放源码的 MySQL 替代品,以确保数据库的开发和维护具有更加开放的社区参与。在很大程度上是兼容的。
也就是,这两个其实是同父异母,可能只是某些函数的差异。比如 MariaDB 可能没有像 MySQL 那样直接支持 XML 类型,因此需要将 XML 数据存储为文本(TEXT)或二进制大对象(BLOB)。
SQL 注入分类
根据参数类型/注入点:字符型,数字型、搜索型
根据提交方式:POST 注入,GET 注入,HTTP HEAD 注入
根据有无回显:联合注入,报错注入,布尔盲注,延时注入
其他注入:堆叠注入,宽字节注入,二次注入等
如果能输出数据信息,可用联合注入
如果能输出报错信息,可用报错注入
如果能区分正确与错误的页面,可用布尔盲注
如果什么信息都不输出,可用延时注入
如果可以创建用户,修改密码,可用二次注入
如果 sql 使用 GBK 编码,可用宽字节注入
post 请求,可用 burpsuite 去做
get 请求,可直接在 url 上体现
-- 在 url 上
%20 空格
%27 '
--+ 就是要把后面的注释掉(--后面要有空格才能注释)
+ 在 url 上会解析为空格
如果是在表单中输入,则 + 直接写成空格就行了
-- 在 sql 中
# 为注释标志
and 1=2
or 1=1
注意 or and 使用
其实也就那几个固定的语句,布尔盲注和延时注入比较麻烦,其他都还可以。虽然题目老,但还是蛮有趣的。
做完这 65 题花了一周,做了笔记,脑子也要疯了。(做之前,brupstuite 没用过,php 没写过,做的时候各种乱七八糟的错误都遇上了)