目录
#知识点:
1、脚本代码与数据库前置知识
2、Access数据库注入
3、MYSQL数据库注入-简易&权限跨库
#前置知识:
-SQL注入漏洞产生原理分析
脚本代码在实现代码与数据库进行数据通讯时(从数据库取出相关数据进行页面显示),将定义的SQL语句进行执行查询数据时。其中的SQL语句能通过参数传递自定义值来实现控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中的敏感数据,如管理员帐号密码)。这一个过程就可以叫做SQL注入漏洞
漏洞产生根本条件:可控变量 特定函数
http://192.168.46.160:85/Production/PRODUCT.asp
http://192.168.46.160:85/Production/PRODUCT.asp?id=1513
如果下面的URL地址测试注入判断id有注入,手工测试该如何进行?
http://192.168.46.160:85/Production/PRODUCT.asp?id=1513&page=1
Production/PRODUCT.asp?id=1513 注入语句&page=1 对
Production/PRODUCT.asp?id=1513&page=1 注入语句 错
-SQL注入漏洞危害利用分析
通过sql注入可以实现对数据库数据的增删改查
SQL注入攻击流程
1、猜测数据库类型
2、根据类型选择思路
ACCESS 独立存在
ACCESS:access数据库是单独存在的数据库,它不像mysql存在多个数据库。
信息:数据库名、表名、列名、数据
MYSQL 统一管理
MYSQL数据库:为了网站和数据库的安全性,MYSQL内置有ROOT最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他数据库的运行。
信息: 最高数据库用户=root用户、表名、列名、数据
数据库A=网站A=数据库用户A、数据库B=网站B=数据库用户B
MYSQL注入的思路:
1、非ROOT的注入攻击:常规类的猜解
2、ROOT用户的注入攻击:文件读写操作,跨库查询注入等
黑盒测试中可以采用user()获取当前用户权限,白盒中看连接用户即可!
MYSQL5.0以上版本:
自带的数据库名information_schema,注入时可以通过以下数据库名查询信息
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
information_schema.schemata:记录所有数据库名
version():查询数据库版本
user():查询用户是否为root
@@version_compile_os:查询系统
database():查询数据库名
案例:
PHP+MYSQL-简易注入-存储特性
先查看一下数据库信息。(正常的SQL注入下肯定不知道数据库的信息,为了方便讲解先透露一下数据库信息,以防出错)
访问该页面并传参id为1,成功获取了数据
那么开始利用and判断是否有注入点
and:可以理解为与的关系,当and左右的两个数据有一个为假时,结果就为假。比如:1=1 and 1=0 结果为假。
下面测试中,and左边的页面刚才访问过可以正常访问,证明为真。如果and后面的数据为假,那么整个表达式都为假,页面就不会正常显示。证明了后面数据可以被执行,那么就是有注入点。(注:也可以使用or,or的表达式中只有一个为真表达式就为真。)
union select 1,2,3:union代表联合查询,为了执行后面的代码。select为查询语句,select直接加数字时,可以不写后面的表名,那么它输出的内容就是我们select后的数字。
通过查询可以看见有1和2两个返回值,那么证明了1的位置和2的位置的数据可以被显示出来。(目前知道数据库中有三列数据,黑盒测试的情况下需要使用折半查找去试)
后面就非常容易了,知道了返回的位置,那么就可以直接利用一些函数查询出数据库的一些基本信息。
PHP+MYSQL-跨库注入-权限属性
首先利用函数database()获取数据库名,数据库为mozhu
UNION SELECT table_name,2,3 from information_schema.tables where table_schema='mozhu'
语句分析:union和select上面有解释不在多说。information_schema.tables是mysql数据库中记录表名的表。table_schema代表的是数据库名称。table_name能理解为information_schema.tables表中的一个列名,而这个列名存储的是数据库中的表名。
语句含义:查询数据库中记录表名的表中的table_name的列,条件为数据库名是mozhu。
已知:数据库为mozhu 表名为ink
UNION SELECT column_name,2,3 from information_schema.columns where table_name='ink' and table_schema='mozhu'
语句分析:information_schema.columns是mysql数据库中记录列名的表。column_name就是information_schema.columns这个表中的一列,列名存储的是数据库中的列名。
语句含义:查询information_schema.columns这个表,条件为表名是ink,数据库名是mozhu,获取表里的column_name信息。
已知:数据库为mozhu 表名为ink 列名为id gName age
UNION SELECT id,gName,age from ink
语句分析:获取ink表中的id,gName,age的信息
由于页面只有两个显示位,age无法显示,可以修改对应的显示位信息进行显示。
SQL注入实战演练
连接:www.comresearch.org/researchDetails.php?id=MQ==
通过连接可以知道id后面的值为base64加密(==结尾通常为base64加密),那么注入的语句也要是base64加密
利用order by查询表名的列数,order by后面跟数字可以进行列数的查询,若列数正确正常返回页面,否则报错。
利用折半查找可以发现列数为7
根据上面的思路,使用union select查询显示位,暴露位置为2,5,4
利用user,database,version查询用户是否为root,数据库名和版本类型
因为版本号时4.1.22,所以没有办法利用information_schema。小编尝试过利用字典并使用python进行暴力破解,但是没有成功。感兴趣的兄弟可以尝试一下。如果是5.0以上的版本,可以直接使用infomation_schema,思路最重要。
墨者:SQL手工注入漏洞测试(Access数据库)
进入漏洞之后记得点维护通知,这里是突破口,不要上来就暴击破解,它是一只数据库漏洞。
和mysql数据库的注入原理一样,直接用and进行注入点探测,发现页面报错,证明存在注入点。
经过小编的认真查询,order by为5时报错,为4时正确,证明表中存在四个字段
and 1=2 union select 1,2,3,4测试显示位,显示位为2和3
union select 1,2,3,4 from admin
admin表直接利用猜解即可,通过返回值知道显示为2和3
提示:在Access数据库中,union两边的数据都为真才会进行显示。在偏移注入的时候,先用order by查询网页表的列数,再利用union查询其他表的列数,如果其他表的列数较少,直接利用*代替。
比如:www.mozhu.com 的order by为8,admin表为4列。语句www.mozhu.com union select 1,2,3,4,* from admin即可正常返回值,查询制表位。
and exists(select id from admin)
使用exists查询列名是否存在,存在则正常返回页面。靶机中常用列名id,username,passwd或者password,最后会发现username和passwd可以正常返回,代表存在列名。
union select 1,username,passwd,4 from admin
利用显示位获取信息即可
md5对密码进行解密并登录获取flag
MD5:32或16位位由数字"0-9"和字母"a-f"所组成的字符串