SQL注入原理和SQLI-LABS实验环境搭建
主机:centos7 ip:192.168.31.128
关闭防火墙并设置开机不启动
systemctl stop firewalld.service
systemctl disable firewalld.service
vim /etc/selinux/config
将第7行改为selinux=disable
reboot重启
iptables -F 清空防火墙规则
下载rpm包
yum -y install httpd mariadb mariadb-server php php-mysql php-gd
(php-gd 库:gd 库是 php 处理图形的扩展库,gd 库提供了一系列用来处理图片的 API,使用 GD 库可以处理图片,或者生成图片。 在网站上 GD 库通常用来生成缩略图或者用来对图片加水印或者 对网站数据生成报表及验证码。)
开启httpd和mariadb服务
systemctl start httpd
systemctl start mariadb
测试apache服务是否开启
vim /var/www/html
phpinfo();
?>
mysqladmin -u root password “123456”
mysql -uroot -p123456
下载sqli-labs:https://github.com/Audi-1/sqli-labs
通过xshell上传到centos7
将sqli-labs包解压到/var/www/html目录
unzip sqli-labs-master.zip -d /var/www/html
修改一下名字方便访问
mv /var/www/html/sqli-labs-master/ sqli-labs
chown -R apache:apache /var/www/html/sqli-labs
cd /var/www/html && vim sqli-labs/sql-connections/db-creds.inc
浏览器访问网址:http://192.168.31.128/sqli-labs/
点击导入信息
点击
关卡
主机:kali2019-1a ip:192.168.31.129
删除旧浏览器文件和软连接
rm -rf /usr/lib/firefox-esr
rm -rf /usr/lib/firefox-bin
rm -rf /usr/lib/firefox
rm -rf /usr/bin/firefox
下载新firefox并通过xshell上传到kali
firefox连接:
https://www.mozilla.org/zh-CN/firefox/new/
解压到/usr/lib/目录下
tar -jxvf firefox-67.0.4.tar.bz2 -C /usr/lib/
创建软连接
ln -s /usr/lib/firefox/firefox /usr/bin/firefox
创建快捷方式
vim /usr/share/applications/firefox.desktop
[Desktop Entry]
Version=666
Name=firefox
Name[zh_CN]=firefox-浏览器
Exec=firefox
Terminal=false
Type=Application
Icon=firefox
连接:
https://github.com/HCTYMFF/hackbar2.1.3
unzip hackbar2.1.3-master.zip
下载后通过xshell上传到kali
打开firefox(在断网的情况下安装插件,不然会自动更新,最新的好像是要收费的)
centos7的ip:192.168.31.132(回到宿舍换成宿舍网络了)
kali的ip:192.168.31.129
这里粘贴一段第一关的部分源码
可以在目标机(centos7)中查看到
在源码内主要是这段:
29 $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
在第一关内刚刚进入时提示输入一个id
源码中的$id应该是个变量,前面会接受我们输入的参数,假设这里我们输入?id=1
http://192.168.31.132/sqli-labs/Less-1/?id=1
(这里的?表示传递参数)
相当于源码中的
29 $sql=“SELECT * FROM users WHERE id=‘1’ LIMIT 0,1”;进行执行。
试试其他方式
http://192.168.31.132/sqli-labs/Less-1/?id=1’ limit 4,3 --+
–+表示注释,后面的内容不执行
在源码内执行的大致样子
$sql="SELECT * FROM users WHERE id=’1’ limit4,3”
limit 4,3表示显示数据库中第4条以后的三条记录
而where id =1表示显示第一条记录
在两种限制条件下输出为0(就是什么也没有输出)
(补充:LIMIT 用法 LIMIT 是 MySQL 内置函数,其作用是用于限制查询结果的条数。
其语法格式: LIMIT [位置偏移量,] 行数 其中,中括号里面的参数是可选参数,位置偏移量是指 MySQL 查询分析器要从哪一行开始显示,索 引值从 0 开始,即第一条记录位置偏移量是 0,第二条记录的位置偏移量是 1,依此类推…,第二个参数为 “行数”即指示返回的记录条数。
一句话概括: 位置偏移量可以理解为跳过前 N 条记录,或从第 N 条记录开始,往后显示 N 条记 录)
关于闭合方式:闭合方式指开发人员在sql语句中的加在参数
就像这两个额冒号(忘记叫什么号了,就像这个‘’)
分析闭合方式:
先试试“”这种:http://192.168.31.132/sqli-labs/Less-1/?id=1‘
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘1’’ LIMIT 0,1’ at line 1
(您的SQL语法有一个错误;检查对应于MariaDB服务器版本的手册,在第1行中使用接近" 1 " LIMIT 0,1’的正确语法)
就是说‘1‘’ LIMIT 0,1‘这里出现了错误,当我们这样注入时相当于源码:
$sql=“SELECT * FROM users WHERE id=‘1‘’ LIMIT 0,1”;
就是因为这里多了个 ‘ 符号,所以会报错,所以有了这种经验后,以后注入就可以通过这种类似的方式判断闭合方式。
常见手动sql注入的闭合方式
r 1=1–+
'or 1=1–+
"or 1=1–+
)or 1=1–+
')or 1=1–+
") or 1=1–+
"))or 1=1–+
具体的使用的那种闭合方式还可以使用反斜杠\来判断,前提是网站会反馈给你错误的原因,不然的话以我现在的水平判断不了。。。。
在centos7端,进入数据库
mysql -uroot -p123456
use security
select * from use
select * from users limit 3,2;
语法:order by 后跟上字段名时,是用于做排序,默认是升序。如果字段名后跟上 desc 则做降序。
select * from users order by username;
用法 2:按第几个字段进行排序,如果超过查询的字段数,就报错 语法:select 字段 1,字段 2 from 表名 order by 数字;
select * from users order by 3;
如果是select * from users order by 2就和select * from users order by username一样的效果了,因为username在这里位于第二个字段,所以,如果是select * from users order by 4;在这里就会报错,因为这里只有三个字段:id,username,password