当前位置:首页 > 网络安全 > 正文内容

php代码审计前奏之ctfshow之sql注入上

访客4年前 (2021-04-15)网络安全980

本系列题目来源:CTFSHOW: https://ctf.show/challenges

sql注入作为常见且危害极大的漏洞,想搞好代码审计,必须将其拿下。

故以 CTF 来练习。
本文包含常见sql注入类型及过滤,还有常见注入类型python脚本编写。

一、无过滤注入

web171~union联合注入

直接开始

成功会先 id为1的用户密码。

1,2,3处都有回显

爆出库名 ctfshow_web

爆出表名 ctfshow_user

爆出列名 id,username,password

爆出字段内容

还可以直接抓包找到 api,直接爆出

web172

流程就不来了,

直接

web173~hex编码

查询语句

//拼接sql语句查找指定ID用户 $sql="select id,username,password from ctfshow_user3 where username !='flag' and id='".$_GET['id']."' limit 1;"; 返回逻辑 //检查结果是否有flag if(!preg_match('/flag/i', json_encode($ret))){ $ret['msg']='查询成功'; }

过滤了返回字符串不能含有 flag,

那我们就将他十六进制编码即可。

web174~py脚本布尔盲注

查询语句

$sql="select username,password from ctfshow_user4 where username !='flag' and id='".$_GET['id']."' limit 1;";

//检查结果是否有flag
if(!preg_match('/flag|[0-9]/i', json_encode($ret))){
$ret['msg']='查询成功';
}

无回显,只好盲注了,

验证了成功可以盲注,第一位ascii是102,也就是

写个脚本。

好家伙,自增脚本结果也是废了一小段时间才跑出来。

那就再写一个二分法脚本:

结果快多了。

web175~py脚本时间盲注,写文件

查询语句

$sql="select username,password from ctfshow_user5 where username !='flag' and id='".$_GET['id']."' limit 1;";

//检查结果是否有flag
if(!preg_match('/[\x00-\x7f]/i', json_encode($ret))){
$ret['msg']='查询成功';
}

匹配了基本 ascii 码值。也就是说基本页面不会回显数据库里的数据。

只会回显

尝试间件盲注成功。

if 函数, if判断,如果为真,返回b,否则返回c

继续写脚本

可是这个脚本耗费时间太长了,42*5 秒 多。

另一种解法:

把 flag 内容写入 文件

二、过滤注入

web176~大小写绕过

·查询语句

$sql="select id,username,password from ctfshow_user where username !='flag' and id='".$_GET['id']."' limit 1;";

//对传入的参数进行了过滤
function waf($str){
//代码过于简单,不宜展示
}

万能密码:

在表中 flag 直接回显

还可以大小写绕过:

web177~绕过空格

反复测试,过滤了空格。

这个不可以 ,可以。

过滤空格可以使用绕过

表名,列名可以用反引号。

web178~%09绕过空格

过滤了空格和

可以用代替空格,也就是

一把梭

web179~%0c绕过空格

经测试,过滤了空格、、

可以用绕过。

还可以一把梭

web180-182~直接查id

把所有能用的空格都过滤了。

换其他姿势,直接查 id

web183~where正则匹配

查询语句

$sql="select count(pass) from ".$_POST['tableName'].";";

//对传入的参数进行了过滤
function waf($str){
return preg_match('/ |*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|#|\x23|file|=|or|\x7c|select|and|flag|into/i', $str);
}

//返回用户表的记录总数
$user_count=0;

需要我们post传入参数

当传入时,有变化

说明有 22 行数据。

这里吧等于号过滤了,所以利用正则。

不能有空格,不能有 *

成功利用 where 条件匹配到 f

写个脚本

web184~right join...on注入过字母

查询语句

$sql="select count(*) from ".$_POST['tableName'].";";

//对传入的参数进行了过滤
function waf($str){
return preg_match('', $str);
}

web213~--os-shell

练习使用--os-shell 一键getshell

function decode($id){
return strrev(base64_decode(strrev(base64_decode($id))));
}
function waf($str){
return preg_match('/ |*/', $str);
}

https://zhuanlan.zhihu.com/p/58007573

直接getshell

六、时间盲注

web214~无过滤时间盲注

payload:

写个脚本:

自增法:

有点慢,在写个二分法:

web215~单引号闭合

payload:

脚本:

web216~括号闭合

payload:

web217~benchmark绕过sleep

查询语句

返回逻辑

function waf($str){
return preg_match('/sleep/i',$str);
}

过滤了 sleep 。

但是还有其他函数, mysql 时间盲注五种延时方法

BENCHMARK(count,expr)
BENCHMARK会重复计算expr表达式count次,通过这种方式就可以评估出mysql执行这个expr表达式的效率。
那我们就让他计算很多次,时间不就长了吗?比如,大约3秒多(口数)

payload:

web218~rlike正则匹配

}

把也过滤了。

不过不慌还可以通过。

rpad(str,len,padstr)
返回字符串str,右填充以字符串str中垫到len字符长度。如果str为大于len,返回值被缩短至len个字符。

repeat(str,count)
返回由字符串str重复count次的字符串。 如果计数小于1,则返回一个空字符串。返回NULL如果str或count为NULL。

like 的内容不是正则,而是通配符

rlike 的内容可以是正则

如耗时 4 秒左右

但是从web有点奇怪,就只返回固定的一小段时间。差不多 1 秒。

换种方式,迪卡尔积

payload:

web219~笛卡尔积

}

过滤了,,可以笛卡尔积。

web220

return preg_match('/sleep|benchmark|rlike|ascii|hex|concat_ws|concat|mid|substr/i',$str);
}

使用 ord 代替 ascii

使用 locate 代替 substr

使用笛卡尔积

六、其他注入

web221~limit注入

查询语句

$sql=select * from ctfshow_user limit ($page-1)*$limit,$limit;

//TODO:很安全,不需要过滤
//拿到数据库名字就算你赢

在后面可以跟两个函数,和,into需要写权限,一般不常见,但是在msyql5.7以后已经弃用,8.0直接删除了。。。

P牛文章

payload:

web222~group by注入

查询语句

//分页查询
$sql=select * from ctfshow_user group by $username;

返回逻辑

//TODO:很安全,不需要过滤

可使用盲注

payload

脚本:

web223~group过滤 数字

与上题一样,不过是过滤了数字.那就利用 true 为 1

payload:

脚本:

web224~exif注入

可以看这里

七、堆叠注入

web225~预编译,handler

查询语句

//分页查询
$sql="select id,username,pass from ctfshow_user where username='{$username}';";

返回逻辑

//师傅说过滤的越多越好
if(preg_match('/file|into|dump|union|select|update|delete|alter|drop|create|describe|set/i',$username)){
die(json_encode($ret));
}

过滤了很多,但没过滤 show ,可以配合 hander 读数据

https://blog.51cto.com/15023289/2559944

payload

还可以预编译

预编译也能用变量
//存储表名
//存储SQL语句
//预定义SQL语句
//执行预定义SQL语句
//删除预定义SQL语句

web226~hex

die(json_encode($ret));
}

过滤了和 括号,那就不能使用 concat 连接了。

使用十六进制编码

paylaod:

web227~存储过程

存储过程。

参考:

web228

还是可以转十六进制。

过滤内容:

payload:

web229

十六进制。

payload:

web230

还是十六进制预编译

八、update注入

web231~update注入

查询语句

$sql="update ctfshow_user set pass='{$password}' where username='{$username}';";

payload:

web232~单引号括号闭合

查询语句

$sql="update ctfshow_user set pass=md5('{$password}') where username='{$username}';";

和上一题一样的,

只不过闭合方式发生了变化。

payload:

web233~时间盲注

时间盲注,

payload:

脚本:

web234~单引号逃逸

过滤了单引号。可以利用实现单引号逃逸。

此时查询语句:

password就会变为。

payload:

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:https://therlest.com/105890.html

分享给朋友:

“php代码审计前奏之ctfshow之sql注入上” 的相关文章

【紧急+重要】勒索病毒解决方案!附:MS17-010补丁下载

  滚动更新:2017年5月13日16:57:22   游侠安全网(良心网站,站长先贴上注意事项和解决方法!防止你看本文的时候就被加密了!   1、本次共计是自动化攻击,利用了Windows的MS17-010。但苹果的MacOS用户不用得意,因为在昨晚之前,我这里得到的好几起勒索攻击案例都是针对...

干洗对衣物有害吗

干洗对衣物有害吗 干洗剂实际上就是有机溶剂,所以对衣服多少都有点危害,只不过高级的干洗剂对衣服损伤小一些而已。 随着人们工作的繁忙和生活节奏的加快,现代人更多地把换下的衣物送到洗衣店干洗,以保证衣服不变形和有更多的时间休闲娱乐,这本是一件提高生活品质的好事,但据最新的研究显示,干洗衣物对身...

安宫牛黄丸 - 北京同仁堂安宫牛黄丸

能降低惊厥和死亡率,天然牛黄天然麝香。对突然脑埂塞,并且只有北京同仁堂生产的安宫牛黄丸才可以使用,北京同仁堂集团顾问金霭英老人说,局方至宝丹、与作用是清热解毒。 4月30之前是350元.重镑产品,公元1541年。平时还是要遵医嘱服用适合自己的降压药。同仁堂的安宫牛黄丸使用的是老方子,黄芩。 北京同仁...

尚村最新水貂皮毛价格,丹麦貂皮衣大概多少钱

样子单女款大概貂皮在8000,014-3-24河北尚村蓝狐皮价格,不过价格一般比较高的啊,这个就要看品牌的了,多看看,我要打印IE收藏放入公文包我要留言查看留言文章来源:中国皮草网添加,60公分6000左右,水貂皮大衣最新价格有木有,这个主要看质量了,水貂皮草大衣真假看皮面:如果是真毛。 元/张,5...

一年黄金价格走势图(黄金价格实时走势图分析

2019年金价将迎来上涨荷兰银行,2018年黄金市场或许不会有太好的表现,是一种软的,你可以随时来平台内查询。 金道贵金属,日交易k线图构成周交易k线图,此时段间,即开始疲软下跌,2016年06月06日老凤祥价格可,黄金价格走势K线图盘面,整体的价格走势是由每天的交易组成的,24kinfo这个平台的...

黄埔燃料油现货价格_今日燃料油市场价格

这句话是指期货比现货价格高100元吗,柴油,1%的权重都没有,通过技术指标和消息面影响来分析的。有的有点差,点88 国际燃料油收盘价涨跌新加坡。244点5 国内燃料油,燃料油,作为成品油的一种,屈居第二位,有的高点有的低一点,2。97#汽油5点38元/价格升,在原油的加工过程中,常关注的消息为OPE...

评论列表

余安戈亓
3年前 (2022-05-30)

回用户表的记录总数$user_count=0;需要我们post传入参数当传入时,有变化说明有 22 行数据。这里吧等于号过滤了,所以利用正则。不能有空格,不能有 *成功利用 where

笙沉望笑
3年前 (2022-05-30)

重复count次的字符串。 如果计数小于1,则返回一个空字符串。返回NULL如果str或count为NULL。like 的内容不是正则,而是通配符rlike 的内容

世味痞唇
3年前 (2022-05-30)

变为。payload:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。