从一道anti sql题讲起

0x00.前言

题目链接 http://antisqli.thinkout.rf.gd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// It's 'Anti SQLi' problem of 'Solve Me'.
error_reporting(0);
$con = mysqli_connect("127.0.0.1", "root", "root","mytest")
or die('SQL server down');

$id = $_GET['id'];
$pw = $_GET['pw'];
var_dump($pw);
echo "</br>";
echo $id.','.$pw."</br>";
echo "SELECT * FROM `user` WHERE `id`='{$id}' AND `pwssword`=md5('{$pw}');"."</br>";
if(isset($id, $pw)){
preg_match(
'/\.|\`|"|\'|\\|\xA0|\x0B|0x0C|\t|\r|\n|\0|'.
'=|<|>|\(|\)|@@|\|\||&&|#|\/\*.*\*\/|--[\s\xA0]|'.
'0x[0-9a-f]+|0b[01]+|x\'[0-9a-f]+\'|b\'[01]+\'|'.
'[\s\xA0\'"]+(as|or|and|r*like|regexp)[\s\xA0\'"]+|'.
'union[\s\xA0]+select|[\s\xA0](where|having)|'.
'[\s\xA0](group|order)[\s\xA0]+by|limit[\s\xA0]+\d|'.
'information_schema|procedure\s+analyse\s*/is',
$id.','.$pw
) and die('Hack detected');

sniperoj some web writeup

0x00.前言

今天机缘巧合发现了这个OJ平台,http://www.sniperoj.com/, 就随手做一下,平台十分小清新,web题目还行,有一点收获,记录一下而已。

0x01.记录

1.php-object-injection

提示是一个反序列化题目,像这种什么都没给的,右键源码什么都木有的,不用说,一定是源码泄露了。swp,bak,~都给上去看看有木有。最后是 http://120.24.215.80:10007/.index.php.swp

在ubuntu中复原一下 vim -r index.php.swp 得:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Logger{
private $logFile;
private $initMsg;
private $exitMsg;

function __construct($file){
// initialise variables
$this->initMsg="#--session started--#\n";
$this->exitMsg="#--session end--#\n";
$this->logFile = "/tmp/natas26_" . $file . ".log";

// write initial message
$fd=fopen($this->logFile,"a+");
fwrite($fd,$initMsg);
fclose($fd);
}

function log($msg){
$fd=fopen($this->logFile,"a+");
fwrite($fd,$msg."\n");
fclose($fd);
}

function __destruct(){
// write exit message
$fd=fopen($this->logFile,"a+");
fwrite($fd,$this->exitMsg);
fclose($fd);
}
}

几道sql

0x00.前言

今天在一个网站上做sql注入的题,有几道题,感觉挺有意思的。

一.题目链接: http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello admin</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
highlight_file(__FILE__);
?>

这代码够简单的啦,还带回显的。看了看最后,估计是要我们盲注得到pw,这还不简单?写个脚本跑去来,得到pw长度,二分法去提取好了。

1
2
3
4
5
6
pw='' || length(pw)>0
.
.
pw='' || ascii(substr(pw,1,1))>0
.
.

对,确实如此,但是实际上我按上面那种方法怎么爆破都不对,甚至怀疑过我的代码,出轨了?

url中的下划线

0x00.前言

今天再做一道CTF题感觉挺有意思的。

题目链接 http://solveme.safflower.kr/prob/give_me_a_link

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
error_reporting(0);
require __DIR__.'/lib.php';

if(isset($_GET['url'])){
$url = $_GET['url'];

if(!preg_match('/^https?\:\/\/'.$_SERVER['HTTP_HOST'].'/i', $url)){
die('Not allowed URL');
}

if(preg_match('/_|\s|\0/', $url)){
die('Not allowed character');
}

$parse = parse_url($url);
if(basename($parse['path']) !== 'plz_give_me'){
die('Not allowed path');
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $parse['scheme'].'://'.$parse['host'].'/'.$flag);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);

echo 'Okay<hr>';
}

highlight_file(__FILE__);

代码比较简单,无非就是几个绕过。 主要就是后面的两个正则感觉挺有意思,很显然焦点在于下划线。其实RFC明确禁止将下划线作为域名的一部分,容易造成误解破坏网络秩序。但是以前做的题中也有出现参数中带有点或者

空格变成下划线的例子。就是那一道smile的题。

php两道题

一: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
25
26
27
28
29
30
 <?php
/*******************************************************************
* PHP Challenge 2015
*******************************************************************
* Why leave all the fun to the XSS crowd?
*
* Do you know PHP?
* And are you up to date with all its latest peculiarities?
*
* Are you sure?
*
* If you believe you do then solve this challenge and create an
* input that will make the following code believe you are the ADMIN.
* Becoming any other user is not good enough, but a first step.
*
* Attention this code is installed on a Mac OS X 10.9 system
* that is running PHP 5.4.30 !!!
*
* TIPS: OS X is mentioned because OS X never runs latest PHP
* Challenge will not work with latest PHP
* Also challenge will only work on 64bit systems
* To solve challenge you need to combine what a normal
* attacker would do when he sees this code with knowledge
* about latest known PHP quirks
* And you cannot bruteforce the admin password directly.
* To give you an idea - first half is:
* orewgfpeowöfgphewoöfeiuwgöpuerhjwfiuvuger
*
* If you know the answer please submit it to info@sektioneins.de
********************************************************************/

某年某月的某一天

 

夏日的酷热渐渐散去,秋意越来越重。“保研路”上的银杏叶子还未变黄,图书馆门前的桂花香气已经四处奔放。长桥还是依旧那么长,只是天空中飞机的引擎声倒是很久没听见了。

0x01.亲爱的路人

已是七月中下旬,暑假里大多数同学都选择实习,我算是放弃了去西安的实习机会吧回到了故乡。家里比学校更热,我从一个火炉到了另一个更热的火炉。回家之前我没告诉家里人我要回家,我买了张硬座票,我不善长说谎,我怕到时候问起来有人会心疼。为什么我坐硬座?其实我很喜欢坐火车,我很享受车窗外的风景,享受火车发出的有规律的声音,享受着和陌生人聊天的感觉。夜晚的硬座火车车厢可以看作是底层社会的一个个小小缩影,在车厢的尽头你可以看见可能因为不会网购买票而只能买到无座的提着鼓鼓麻皮袋的为生活努力奔波的农民工,也可以看见脸上布满沧桑,但充满故事很健谈的大叔大妈。夜晚了,硬座车厢几乎没有人走动,也没有什么人上车下车,我对面坐的是一对母女,要带她女儿回她爸工作的地方玩一个月。萝莉很小,也很调皮,问她读几年级,她一会说三年级一会说六年级,但我怎么觉着她才读大班。就像三年前也是在一节硬座车厢上,我身旁坐着一位我以为才读六年纪左右的小女孩居然是大三的学姐……从言语中可以看出萝莉母亲很严格,对萝莉在车上做的调皮举动很生气,对萝莉要求很高的同时也对其寄有很大的希望。我身旁坐着的是一位和我年纪相近的学生,他目的地是火车的倒数第二个站,他没有带食物上车,只有两瓶水,可是他要坐近30个小时才能到达目的地。从他眼神中,能感觉深深的忧郁,他路上很大部分时间望着窗外,表情没有发生过太大变化。也许有什么心事吧。夜深了,车厢的空调开的很低,我穿个短袖,把我冷的够呛,萝莉一直睡不着,逗我陪她玩,我并没有生气,因为没有人能够有个很好的睡眠在这车上,顶多眯一会。旁边的小哥也睡不着,和萝莉互动起来,一起听起了歌还小声合唱起来,画面很美好,就像极其心疼妹妹的哥哥一样。在不会熄灯的硬座车厢里,某一个窗面上倒映着两张年轻的面容,随着飞奔的列车,划过无尽且未知的黑暗……

小游戏-7,8

一:注册 题目地址http://game6.iok.la/reg.asp(第零关)

您能根据前面的回答,预测您最后一个问题的答案吗?

A:98503264587102541690 - 68034165897022102600

B:90534205890120542090

A:59703214569802513647 - 13983025584603517840

B:59980225089803007807

A:56055201367950321158 - 56630489702544691502

问下一次B是什么。这个问题其实很有趣。图灵大师就是大师。以前区分网上的机器人和真正的人,有提出图片验证码等解决方法,但在人工智能越来越强大的今天,图片验证码可能有些不实用,还有其他有用的验证码或者说思想

http://wx.7399.com/jiaoyu/974664.html

回到题目可以看作一个找规律的题。最后的规律就是

A中的两个数字一一比较,相同取0,不同哪个大就取谁。

小游戏5,6

Hash长度拓展攻击

1.题目地址http://web.bxsteam.xyz/hash/admin.php

题目提示是粗心的程序完了删掉什么东西,还自以为Hash很安全。提示的很明显,直接在链接后面加上.swp得到程序员在用VI时不正常退出的一个类似备份文件,在Linux中将该文件恢复。vim -r admin.php.swp。里面关键代码就是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 <?php
$auth = false;
$role = "guest";
$salt ="xxxxxxxxxxxxx";//len:13
if (isset($_COOKIE["role"]))
{
$role = $_COOKIE["role"];
$hsh = $_COOKIE["hsh"];
if (stripos($role,"admin")!==false&&$hsh === md5($salt.$_COOKIE["role"]))
{
$auth = true;
}
else
{
$auth = false;
}
}
else
{
$s = $role;
setcookie('role',$s);
$hsh = md5($salt.$s);
setcookie('hsh',$hsh);
}
if ($auth) {
echo "Welcome Admin.Your flag is cumtctf{you_know_this_is_not_the_flag}";
} else {
echo "<h3>Only Admin can see the flag!!";
}
?>

这个代码很简单,以前做过这样的题,就是Hash长度拓展攻击。在我的理解里这种攻击就是,当你知道A+B的hash值,且知道B,A的长度知道,那么我们就可以知道在A+B后面附属一些其他值的hash。这是跟Hash算法的过程有关系的。

小游戏1,2,3,4

0x01 ASP代码

转化成PHP代码就是:

1
2
3
4
5
6
7
8
9
10
<?php
$x=$_GET["id"];
$x=str_replace("a","aad",$x);
$x=str_replace("i","in",$x);
$x1=substr($x,1,2);
$x2=substr($x,3,6);
$x3=$x1.$x2;
if ($x3=="admin")
echo "ok";
?>