前言
因为老师说CSP过了可以免考数据结构,这么好,当然得报啊。然而,刚碰到第一题就让我想起了高中被算法支配的恐惧了。难道后端检查答案不是直接对比输出的字符串吗?难道还验证输出的数据类型???
郁闷至极,这也是我放弃算法比赛的原因之一,脱离实际,考核数据极端,特写此博客让大家避坑。
XXE(XML External Entity c Injection) 全称为XML外部实体注入
。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
本文涉及的平台是sqli_labs,地址为:https://github.com/Audi-1/sqli-labs
友情链接:详细WP及相关资料请访问刘师傅github博客: https://github.com/Kit4y/Sql-Injection
只有前端验证,用burp截包修改文件后缀名。
对MIME进行验证,更改MIME即可绕过。
对后缀名进行黑名单验证,只要上传不在黑名单中的脚本就行。
一般可被识别为php脚本的后缀名有php,php3,php4,php5,php7,phtml,pht,phps,php3p
阅读本文需要的知识储备
暑假里小明(ctfer)今天去找小红玩耍,却发现刚高考完的小红居然在家自学PHP!沉溺于码代码的小红根本无暇搭理小明,为了搭讪小明无奈凑上前去,在屏幕上看到了如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<?php
$link = mysql_connect("ip", "username", "password"); //链接数据库
mysql_query('use login_base'); //选择数据库
header("Content-type:text/html;charset=utf-8"); //设置显示文字编码
if (isset($_POST["sub"])) {
$username = $_POST["username"];
$password = $_POST["password"]; //获取表单数据
if ($username == ""|| $password == "") { //name和password不能为空
header('Refresh:3;url=index.html');
echo '请填写完整数据';
}
$sql = "select * from login where username= '{$username}' and password = '{$password}' " ;
$res = mysql_query($sql);
$result = mysql_fetch_assoc($res);
if (!$result) { //判断是否正确
header('Refresh:3;url=index.html');
echo '登陆失败';
} else {
header('Refresh:3;url=index.html');
echo '登陆成功';
}
}
mysql_close(); //关闭数据库
?>
emmm,签到。
一开始以为这题改一改user.xml就行了,然后才发现自己太天真了。
直接解压jar包,审计源码。
在Game.class文件中发现flag输出部分1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22if (this.score >= 500 && this.isshow) {
String flag = "eobdxpmbhf\\jpgYaiibYagkc{";
int key = this.snake.len - this.score;
String xx = "";
int i;
char c;
for(i = 0; i < flag.length() / 2; ++i) {
c = flag.charAt(i);
c = (char)(c ^ key);
xx = xx + c;
}
for(i = flag.length() / 2 + 1; i < flag.length(); ++i) {
c = flag.charAt(i);
c = (char)(c ^ key * 2);
xx = xx + c;
}
JOptionPane.showInputDialog((Component)null, "This is your flag CALCULATE BY YOUR SCORE:\n", "Congratulations", -1, (Icon)null, (Object[])null, xx);
this.isshow = false;
}
php代码审计,emmm,上代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<?php
$num=$_GET['num'];
$str=$_GET['str'];
show_source(__FILE__);
if (isset($num)&&isset($str)) {
if (preg_match('/\d+/sD',$str)) {
echo "vagetable hhhh";
exit();
}
$result=is_numeric($num) and is_numeric($str);
if ($result) {
include "flag.php";
echo "$flag";
}
else{
echo "vagetablessssss";
}
}
?>
根据代码可以知道脚本判断用户提交的str和num是否为数字,如果是就提供flag。
可是在判断str为数字之前,先对其进行了正则匹配,这可咋办。
2333,直接利用万能的php无法处理上传数组的情况绕过它。
构造payload
?str[]=123&num=123
得到答案