靶场笔记之sql注入石器篇1

前言

    偶然发现了https://redtiger.labs.overthewire.org/网站,上面有关于sql注入的练习,分level1到level10,可依次进行练习。

    本篇先介绍level1至 level5的题目,可动手操作起来,关于sql注入的相关知识点不做赘述。  

level 1之简单注入

    点击level 1进入https://redtiger.labs.overthewire.org/level1.php页,尝试了username和passwd没有发现任何问题,后来发现网站上有个Category:1的可供点击的地方。

    入口点:

    

    使用burpsuite截断查看一下访问地址:

    将请求地址改造成 GET /level1.php?cat=1%20and%201%3D1,既加入“and 1=1”来判断是否存在注入点。更改之后发现页面结果无变化,说明可以直接在cat=1后追加注入点。

    构造链接/level1.php?cat=1%20order%20by%201,2,3,4(order by 1,2,3,4),分别从1开始尝试,当参数为order by 1,2,3,4,5时,页面出现This category does not exist,说明以“cat=1***”作条件的查询结果集只有4列。

    构造链接 /level1.php?cat=1%20union%20select%201,2,3,4(union select 100,200,300,400),通过查看返回结果,页面html中显示了300和400,说明第三列和第四列的结果可以显示在页面中。根据之前的提示数据库表为level1_users,猜测表中包括username和passwd字段,构造链接/level1.php?cat=1%20union%20select%201,2,username,password%20from%20level1_users(union select 1,2,username,passwd from level1_users),发现页面将用户名和密码显示出来,进行登陆即可。

level 2之简单登陆绕过

    点击level 2进入https://redtiger.labs.overthewire.org/level2.php页,该页面只有一个Login按钮,通过burpsuite拦截一下:

    其中username和password是通过post请求进行传递的,而且Cookie中的level2login值在上一步注入成功之后已经给出了。

    分别修改username和password,加入sql注入字段予以尝试,发现在password的value中是有效的。其构造的password对应的value为test%27%20or%201%3D1%23(test' or 1=1#)。

level 3之错误信息

    第三节是让找到Admin密码,可以点击 Admin 链接,使用burpsuite进行拦截

    

    这里给出了提示信息:try to get an error,暂时没想明白什么意思,看到链接有 usr=MDQyMjExMDE0MTgyMTQw字样,第一感觉此处应该有注入点,第二感觉这个参数应该是编码过的,于是在线进行了base64解码,然后添加各种注入方式字符并重新编码尝试,都不可以。

    最后只有厚着脸皮查看了别人的解答,才发现try to get an error 才是解题的关键,在将usr=MDQyMjExMDE0MTgyMTQw修改为usr[]=MDQyMjExMDE0MTgyMTQw,在burpsuite的回复中看到了报错信息,出错的地方在服务端的urlcrypt.inc文件中,输入https://redtiger.labs.overthewire.org/urlcrypt.inc恰好看到了文件内容,里面涉及到了usr参数的编解码函数。果然,除了base64之外,还用到了随机数异或操作。看来做渗透除了有迹可循,更得发散思维灵活多变才行。

    文件中作者给出了php5.*的提醒,因为函数中所用到的rand函数在不同的php版本或者其他语言中计算出来的结果是不同的。

    搜到了http://www.dooccn.com/php/平台,里面的php恰好是5.*版本的,于是把解密的方法拷贝进去,运行一下结果恰好是Admin。好了,接下来将加密方法拷贝进去,就可以伪造注入了。

    将MDQyMjExMDE0MTgyMTQwMTc0MjIzMDg5MjA0MTAxMjUzMjA1MDIwMjU0MDky作为usr的参数,重新发送请求依然把Admin用户的信息检索出来了,确认注入点是可用的。

    通过构造Admin' order by 1,2,3,4,5,6,7,8#和Admin' order by 1,2,3,4,5,6,7#发现本次检索数据共有7列。然后构造test' union select 100, username,300,400,500,password,700 from level3_users where username = 'Admin'#语句,通过加密函数加密后的参数为MDMxMjEwMDE2MTcxMTk3MTY5MTM4MDg2MjAzMTEwMTc5MjIwMDkwMTcwMDE5MDAwMTg4MDIxMTg5MDkxMDYxMjE5MjQzMjE1MDE3MTY5MjAzMTQyMjM1MDQ1MjE2MTQ5MDQwMDQzMjI0MjE0MTQyMjUxMDQ2MTE2MjUyMjAxMTEzMjAyMjI0MTc2MDAxMjE2MDgxMTM3MTIxMDY2MTQyMjE4MDMxMTI2MjI0MjQ3MDQ0MDM2MDc2MTQ2MTAzMDc1MTI1MDk3MTA3MjE1MjEyMTE0MTM4MjAzMDc5MDUxMTkzMjE0MTE3MTIzMTk5MDg3MTE5MTUzMDMyMTQzMjAyMDE1MDM2MjI1MDU3MjQwMjQ2MDY5MTgxMDU4MjI1MjAyMDg5MTk4MDA3MDU5MjU1。

    访问然后可以显示出来密码值。

level 4之盲注

    第四到题根据提示是要求进行盲注,通过点击click me,使用burpsuite进行拦截

    查看url链接id=1,且返回值显示了Query returned 1 rows,猜测id=1应该是数据库表的查询条件,将id=1修改为id=2,结果显示为0 rows,修改为id=1%20and%201%3D1,显示等同于id=1,由此判定此处存在注入点。

    该题目需要进行SQL blind injection,题目中已经给出了表名level4_secret,列名keyword,以及行数为首行,因此只需要进行keyword值的猜测即可,一般使用的是二分法。

    构造查询语句 id=1 and length( substr( (select keyword from level4_secret limit 0,1), 1) > number, number是整数值。通过不停的变动number值(二分法),更改and之后的bool结果,并根据显示结果来判断keyword值的长度。

     转码之后的链接为:id=1%20and%20length%28substr%28%28select%20keyword%20from%20level4_secret%20limit%200%2C1%29%2C1%29%29%3E20

    最后得到keyword的长度是21。

    构造查询语句 id = 1 and ascii( substr( (select keyword from level4_secret limit 0,1), 1, 2 ) ) > ascii_number,ascii_number是ascii码值,可查看ascii表(man ascii),一般取值范围为0-127,变更时候也可使用二分法,更改and之后的bool结果,并根据显示结果来判断对应位置的字符是什么。然后将1,2依次改为2,3、3 ,4......依次猜测每个位置的字符。

    转码之后的链接为:id=1%20and%20ascii%28substr%28%28select%20keyword%20from%20level4_secret%20limit%200%2C1%29%2C1%2C2%29%29%3E64

    最后得到的keyword的值为: killstickswithbr1cks!

level 5之高级登陆绕过

    第五道题是一个高级一点的sql注入,进入之后随便输入一下用户名和密码,此处用户名使用了test,密码也使用了test,使用burpsuite进行拦截

    提示信息上面说明了此处不可以进行盲注,密码是通过md5杂凑值算法计算过的,而且要注意登陆的错误信息,我们首先看到的的是用户名不存在的错误信息。

    看到此处,我们率先想到的是给username加点注入,更改username=test 为 username=test'%20or1%3D1%23(既username=test' or 1=1#),重新发送请求会发现页面的错误信息改成了login failed,并没有提示用户未找到,于是我们可以大胆进行猜测,此处的注入已经生效了,而且后台的登陆逻辑应该是先通过用户名查找对应记录(包括密码信息),然后再做密码校验。如果依据用户名进行的查询语句没有找到数据的话,页面应该显示用户名不存在,如果找到对应的记录(查询语句条数大于1),则会进行密码比较,密码比较失败应该会提示登陆失败字样。我们通过注入条件or 1=1,令查询语句恒成立,输入任意用户名信息都可以从用户表中查询出来结果集。

    接下来我们构造查询条件为 username=test%27%20or%201%3D1%20order%20by%201,2%23(既 test' or 1=1 order by 1,2...)。当order by 后面的参数为1,2,3页面会报列相关的错误信息,而order by 1,2则不会报sql错误信息,因此我们猜测查询用户表时查询到的结果集为两列,通过猜测基本可以确定一列是用户名,另一列是密码信息。此处可以尝试一下回显等操作,会发现页面不会有结果集的任何回显信息。

    这时可以使用union伪造一条我们可以控制的结果了,我们可以让登陆的查询逻辑查询出来我们想要的密码结果。

    重新构造username值为:test%27%20or%201%3D1%20union%20select%20100%2C200%20limit%201%2C1%23(既 test' or 1=1 union select 100, 200 limit 1,1#),此处我们通过union加入了我们的数据集合100,200。

    例如:

    张三   615DB57AA314529AAA0FBE95B3E95BD3

    李四   36C942351EC9CC3AD124E288A5C9CF0B

    100     200

    然后我们通过limit 1,1来取最后一条记录,此处因为记录较少,可以稍微尝试一下,当使用limit 2,1时页面就会报错用户不存在(查询结果为空,既结果集合应该不到3条)。然后让passwd=200,重新发送请求进行尝试,我们发现登陆依然是失败的。

    回想一下,发现还有一个密码加密条件没有使用呢。通过页面输入的密码,传递给后台之后应该率先进行了md5杂凑值计算,然后再与检索出来的结果集中的密码进行比较。此时我们重新构造username的值为:    test%27%20or%201%3D1%20union%20select%20100%2C%27098f6bcd4621d373cade4e832627b4f6%27%20limit%201%2C1%23

    既:test' or 1=1 union select 100,'098f6bcd4621d373cade4e832627b4f6' limit 1,1#, 其中098f6bcd4621d373cade4e832627b4f6为密码字符串test的md5哈希值。我们的查询语句有意的控制查询结果,让用户检索出来的密码为098f6bcd4621d373cade4e832627b4f6,在通过md5sum("test")的运算结果进行比较,从而完成登陆。

    

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值