实验吧web解题记录

自以为sql注入掌握的还是比较系统的,然而,做了这些题之后才发现,大千世界无奇不有,真是各种猥琐的思路...还是要多学习学习姿势跟上节奏呀

登录一下好吗??

http://ctf5.shiyanbar.com/web/wonderkun/web/index.html

试了一下发现他过滤了/ or union select - #

虽然and ‘ " = + %没有被过滤,但用%0b和%23都没效,于是还在想这是用了多麻烦的WAF,越想越复杂我竟然还去用xss,真是跑题了...

然而最后的payload是这样的...跪了,果然题刷的太少吗

who are you?

http://ctf5.shiyanbar.com/web/wonderkun/index.php

进入这个页面,发现他获取了我的ip,首先想到的就是user agent注入,用updatexml试一下,什么错的没有报...看来这个思路不行

百度了才知道这是一道伪造IP的题,相关知识可以看这里:http://www.cnblogs.com/x2048/articles/1794020.html

总结下,伪造IP的HTTP头都有这些:

X-Forwarded-For
Client-IP
x-remote-IP
x-originating-IP
x-remote-addr

一般用的最多的就是前两个,这里我们用X-Forwarded-For来伪造

但是很奇怪,不管构造的是什么语句,都会返回到页面,看了下别人的writeup发现,他的后台处理过程大致是这样的,首先获取到HTTP-X-Forwarded-For,对他进行字符串的处理,只截取逗号前的内容,然后直接将其输出到页面,再插入到数据库,但应该没有对插入结果做处理,即没有输出数据库的报错仅输出空,所以想从数据库的报错获取信息应该是不行了,返回页面也是不具判断性的,那么可以考虑时间型的盲注

这里解决的方法可以有三种:

1、写个盲注脚本跑

这是跑出来的库名:

表名:

字段:

于是,我们知道了flag存储在flag表的flag字符里,且长度为32,接下来直接跑就行了

2、用burp进行时间盲注

3、用sqlmap进行http头的盲注

然后,要注意的是跑出来的结果要加在ctf{xxx}里....被坑的很惨,跑出来flag一直提交不对,最后发现花括号用的中文字符输入的...

因缺思汀的绕过

http://ctf5.shiyanbar.com/web/pcat/index.php

查看网页的源码,发现登录的源码路径是source.txt

于是拿到源码如下:

 1 <?php
 2 error_reporting(0);
 3
 4 if (!isset($_POST[‘uname‘]) || !isset($_POST[‘pwd‘])) {
 5     echo ‘<form action="" method="post">‘."<br/>";
 6     echo ‘<input name="uname" type="text"/>‘."<br/>";
 7     echo ‘<input name="pwd" type="text"/>‘."<br/>";
 8     echo ‘<input type="submit" />‘."<br/>";
 9     echo ‘</form>‘."<br/>";
10     echo ‘<!--source: source.txt-->‘."<br/>";
11     die;
12 }
13
14 function AttackFilter($StrKey,$StrValue,$ArrReq){
15     if (is_array($StrValue)){
16         $StrValue=implode($StrValue);
17     }
18     if (preg_match("/".$ArrReq."/is",$StrValue)==1){
19         print "姘村彲杞借垷锛屼害鍙禌鑹囷紒";
20         exit();
21     }
22 }
23
24 $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
25 foreach($_POST as $key=>$value){
26     AttackFilter($key,$value,$filter);
27 }
28
29 $con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
30 if (!$con){
31     die(‘Could not connect: ‘ . mysql_error());
32 }
33 $db="XXXXXX";
34 mysql_select_db($db, $con);
35 $sql="SELECT * FROM interest WHERE uname = ‘{$_POST[‘uname‘]}‘";
36 $query = mysql_query($sql);
37 if (mysql_num_rows($query) == 1) {
38     $key = mysql_fetch_array($query);
39     if($key[‘pwd‘] == $_POST[‘pwd‘]) {
40         print "CTF{XXXXXX}";
41     }else{
42         print "浜﹀彲璧涜墖锛?";
43     }
44 }else{
45     print "涓€棰楄禌鑹囷紒";
46 }
47 mysql_close($con);
48 ?>

从源码中可以知道这些全都被过滤了:and|select|from|where|union|join|sleep|benchmark|,|\(|\)

并且数据库中只有一条数据

if (mysql_num_rows($query) == 1) {

最核心的部分是这里

$sql="SELECT * FROM interest WHERE uname = ‘{$_POST[‘uname‘]}‘";

大致的执行过程是先将用户输入的uname作为查询条件,在数据库中查询uname和pwd,然后将查询到的pwd与用户输入的pwd进行比较,内容一致才输出flag

这里的思路是,利用group by pwd with rollup在查询中的一个特点,他可以返回pwd所在的那一条记录,通过limit控制返回哪一条,因此他不可以返回多条,一旦返回2条及以上,pwd就会为空,但同一条记录中的其他字段则是正常的

那么利用这一点令查询结果为空,我们输入的pwd也为空值,则构成了if(null == null)为true

简单的sql注入之三

http://ctf5.shiyanbar.com/web/index_3.php

看源码,是一个用get方式传参数id的查询,于是手工注入一波,发现单引号引起报错,加上注释后回显正常,id在1~3的范围都可以正常回显“Hello!”,否则返回空,尝试逻辑运算,可以正常返回,那这就很好办了

然后,我就开始入了手注的坑...

首先来试试有几个字段

2报错了,说明只查询出一个字段,那么用union试试

没有想要的结果回显,很奇怪,看来这个Hello不是输出的位置,应该是后台在获取到id的值后,执行sql语句,如果存在查询的结果,那么就输出Hello,但不输出结果

如果是这样的话,那么只能从报错回显入手了,先试试双注入

很尴尬,做了报错处理?那试试xpath的报错

还是不行...好吧,报错这条路也被堵了,那就考虑盲注吧

根据上面页面中的不同返回,我们可以写一个bool型的盲注脚本来爆数据库,当然也可以用burp搞定

这里偷个懒,因为已经知道ctf的套路了,所以可以直接来猜表名和字段

参考文献:

http://www.jianshu.com/p/5d34b3722128

时间: 2024-11-15 14:20:33

实验吧web解题记录的相关文章

20155201 网络攻防技术 实验八 Web基础

20155201 网络攻防技术 实验八 Web基础 一.实践内容 Web前端HTML,能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前端javascipt,理解JavaScript的基本功能,理解DOM.编写JavaScript验证用户名.密码的规则. Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密码.建表. Web后端:编写PHP网页,连接数据库,进行用户认证. 最简单的SQL注入,XSS攻击测

20155201 网络攻防技术 实验九 Web安全基础

20155201 网络攻防技术 实验九 Web安全基础 一.实践内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 二.报告内容: 1. 基础问题回答 1)SQL注入攻击原理,如何防御 SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息. SQL注入攻击的典型手段:判断应用程序是否存在注入漏洞,收集信息

20155222卢梓杰 实验九 Web安全基础

实验九 Web安全基础 今天不多bb,打开webgoat就是干好吧 1.简单字符串sql注入 可以看到这个实验说明是 "下表允许用户查看其信用卡号码.尝试插入一个SQL字符串,以显示所有信用卡号码." 下面已经显示了后台使用的sql语句是 SELECT * FROM user_data WHERE last_name = 'Your Name' 既然我们的目的是要显示所有信用卡的记录,所以我们会想到让SELECT * FROM user_data WHERE后面的表达式为永真,所以我们

Web学习记录&lt;一&gt;目标与任务

3D打印机的项目终于小小的告一个段落了.在3D打印这个领域里,绝大多部分都是机械的从业人员,年龄普遍在30岁以上.在这一年的编程生涯里面,充当了半个程序员的角色,从最开始的读LinuxCNC源码,到后来的开发3D打印机桌面切片软件,在这个行业里的人看来,都是些边外活.山寨太厉害了,传统行业里的竞争就是这么残酷,今天你家出机器了,三天时间,人家就能抄出来.只有里面的软件是抄不来的.于是,国内大部分机器用的都是国外两年前就已将停止维护的开源软件. 这个行业的路还很远,我会一直关注下去,适当的时候,将

解决Apache的错误日志巨大的问题以及关闭Apache web日志记录

调整错误日志的级别 这几天 apache错误日志巨大 莫名其妙的30G  而且 很多都是那种页面不存在的  网站太多了  死链接相应的也很多于是把错误警告调低了 因为写日志会给系统带来很大的损耗.关闭日志以后,甚至最高可以提高整体性能近40%(粗略估计)那么如何关闭日志呢? 可以通过降低log级别的办法来减少日志读写. 这里要提醒的是,这么做将给"入侵检测"以及其他基于日志分析的工作带来麻烦.所以请谨慎使用.网上相关文章很多,但说的都不详细,擦边而过,下面详细说一下具体操作步骤. 编辑

ASP.NET Web API 记录请求响应数据到日志的一个方法

原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个方法 REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉.后来微软又推出了一个ASP.NET Web API,专门用来处理一些基本的Http服务,即灵活又简单,推荐大家都看看. 今天这篇文章是使用ASP.NET W

Pwnable中的passcode解题记录:

Pwnable中的passcode解题记录: 看下源码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void login(){ 5 int passcode1; 6 int passcode2; 7 8 printf("enter passcode1 : "); 9 scanf("%d", passcode1); //这里没有加取地址符号 10 fflush(stdin); 11 12 //

20155222卢梓杰 实验八 Web基础

实验八 Web基础 1.安装apache sudo apt-get install apache2 2.启动apache service apache2 start 3.使用netstat -tupln |grep 80命令查看80端口是否被占用,如果已被占用,修改配置文件ports.conf中的内容以修改监听端口vim /etc/apache2/ports.conf 4.重启apacheservice apache2 restart 5.测试apache是否正常工作 浏览器打开 127.0.0

2017-2018-2 20155225《网络对抗技术》实验九 Web安全基础

2017-2018-2 20155225<网络对抗技术>实验九 Web安全基础 WebGoat 1.String SQL Injection 题目是想办法得到数据库所有人的信用卡号,用Smith登录后,得到Smith的两个信用卡号,如图 但如何才能得到所有人的信用卡号呢? 只需要输入' or 1 = ' 1,这样构造可以将引号闭合,再or上一个永真式,就能屏蔽掉前面的条件. 2.Log Spoofing 在User Name中以这种格式注入:Use CR (%0d) and LF (%0a)