0x001 相关知识
查询语句
select
insert
update
delete
order by
内置函数:代码中使用相关过滤函数
mysql_real_escape_string()
addslashes()
stripslashes()
htmlentities()
strip_tags()
htmlspecialchars()
is_int() 类型判断
更多注入方式查看:https://blog.csdn.net/weixin_44032232/article/details/113549081
产生sql注入的条件:
- 参数可控。
- 被带入的参数是否带入sql语句执行。
根据以上的两点我们在代码审计中寻找是否存在注入点。
0x002 审计流程
拿到源码导入审计系统,开启自动审计,先组略看下
根据审计系统审计出的结果依次排查复现是否存在注入点。
进入这个文件查看代码,这里的$_SERVER
接收的HTTP_X_FORWARDED_FOR
我们可以进行伪造
我们继续跟进查看哪里调用了getip()
这个方法,鼠标选中-右键-定位函数
跟进代码
由上图可以看到getip
获取的结果带入到@htmlentitdm
中进行了处理,处理后直接带入到sql语句中进行执行,那我们只需要查看htmlentitdm
方式是否对getip
的结果进行了严格过滤。
继续跟进htmlentitdm
htmlentitdm
方法对传入的参数进行替换,替换后使用trim
去空格等操作后又调用htmlentities
方法进行处理。
htmlentities
使用方法:https://www.w3school.com.cn/php/func_string_htmlentities.asp
语法
htmlentities(string,flags,character-set,double_encode)
flags参数:
可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
源码中使用的ENT_QUOTES
对单引号和双引号进行了编码